Modelchoicefield объединить два поля в одно поле - django

Привет, я не знаю, как преобразовать модель двух полей в одну «настраиваемую», чтобы предложить уникальное поле (передать («fieldA», «fieldB») в («fieldA fieldB»).

Я пытаюсь создать внутреннюю функцию модели, но без исключения ...

models.py

class Referencebank(models.Model):
    idtable1 = models.AutoField(db_column='idtable1', primary_key=True)
    genus = models.CharField(max_length=45, blank=True, null=True)
    species = models.CharField(max_length=45, blank=True, null=True)
    subspecies = models.CharField(max_length=45, blank=True, null=True)


    def getScientifName(self):
        return str(self.genus) + " " + str(self.species);


    class Meta:
        managed = False
        db_table = 'table1'

forms.py

class ScientifNameForm(forms.Form):

    for ref in Referencebank.objects.all():

        queryset = ref.getScientifName();
        print("\n queryset")


    scientifName = forms.ModelChoiceField(queryset=Referencebank.objects.values_list('genus','species').order_by('genus').distinct(),
                                                   empty_label="(Nothing)",
                                                   required=False,
                                                   help_text="Select the bacteria",label='Scientific Name')

В forms.py цикл for правильно выполняет результат, который я хочу отобразить в поле выбора модели.

Я хочу что-то подобное

        scientifName = forms.ModelChoiceField(queryset=Referencebank.objects.values_list('scientificName').order_by('scientificN').distinct(),
                                                   empty_label="(Nothing)",
                                                   required=False,
                                                   help_text="Select the bacteria",label='Scientific Name')

Было бы проще определить __str__ на самой модели и использовать queryset=Referencebank.objects.all()?

decadenza 28.01.2019 11:34
0
1
1 329
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вам нужно переопределить метод label_to_instanceModelChoiceField.

from django import forms

class ScientificNameChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.getScientifName()

Затем используйте свое настраиваемое поле в своей форме.

class ScientifNameForm(forms.Form):
    scientifName = ScientificNameChoiceField(
        queryset=Referencebank.objects.all(),
        help_text="Select the bacteria",
        label='Scientific Name',
    )

Спасибо за Ваш ответ. Я думаю, вы имели в виду ScientificNameChoiceField вместо ReferencebankChoiceField в class ScientifNameForm(forms.Form). У меня есть эта ошибка с вашим ответом AttributeError: 'ScientificNameChoiceField' object has no attribute 'getScientifName', возможно, я действительно не понимаю некоторых советов о моделях / формах в django.

DalinDad 11.04.2018 12:23

Я исправил пару проблем. Название зависит от вас, но оно должно быть последовательным. В label_from_instance это должно быть obj.getScientifName() вместо self.getScientifName().

Alasdair 11.04.2018 12:25

Идеальный ответ =)

DalinDad 11.04.2018 13:32

Другие вопросы по теме