DJANGO выберите ФОРМУ из сгенерированного списка и добавьте дополнительное значение по умолчанию - PullRequest
1 голос
/ 22 мая 2019

Я хочу иметь выпадающую форму выбора.В этом примере я хочу иметь раскрывающийся список всех делений, но он может включать еще одну дополнительную запись (по умолчанию = 0).

Как я могу создать список для выбора и добавления дополнительного элемента?

модели:

class Employee(models.Model):
    username = models.CharField(max_length=30, blank=False)  
    division = models.ForeignKey(Division,null=True)

class Division(models.Model):
    name_of_division = models.CharField(max_length=30)  

forms.py

class EmployeeEditForm(forms.ModelForm):   
    username = forms.CharField(max_length=30, required=True)    
    division = forms.ChoiceField(widget=forms.Select, choices=XXXXWHATSHOULDIPUTHEREXXX)

    class Meta:
        model = Employee
        fields = ("username","division")    

для этой переменной, я хочу, чтобы список был примерно таким, но я не уверен, каким он должен бытькодированный:

XXXXWHATSHOULDIPUTHEREXXX = (0, Default) + Division.object.all()

Например, он должен сгенерировать что-то вроде этого:

division
0 - default (this is not in the Division table) <-- i want to add this to the select list
1 - corporate
4 - human resource
7 - engineering

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Вы ищете ModelChoiceField вместо просто ChoiceField:

class EmployeeEditForm(forms.ModelForm):   
    username = forms.CharField(max_length=30, required=True)    
    division = forms.ModelChoiceField(widget=forms.Select, queryset=Division.object.all(), empty_label="(Default)")

    class Meta:
        model = Employee
        fields = ("username","division")    

Если вам нужно передать в форму дополнительное значение - формы сами по себе не имеют доступа к объекту запроса и поэтому не могут определить, какой пользователь в данный момент зарегистрирован. Ваше мнение должно передать текущее имя пользователя вместо:

def index(request):
    # ...
    form = EmployeeEditForm(request.POST or None, company_id=request.user.employee.company.id)
    # ...
class EmployeeEditForm(forms.ModelForm):   
    username = forms.CharField(max_length=30, required=True)    
    division = forms.ModelChoiceField(widget=forms.Select, queryset=None, empty_label="(Default)")

    class Meta:
        model = Employee
        fields = ("username","division")    

    def __init__(self, *args, **kwargs):
        company_id = kwargs.pop('company_id')
        super().__init__(*args, **kwargs)
        self.fields['division'].queryset = Division.objects.filter(company_id=company_id)

Не передавайте экземпляры сериализованных объектов в форму - используйте вместо них id или pk и фильтруйте набор запросов в форме этим id.

0 голосов
/ 22 мая 2019

Я не уверен, что это то, что вам нужно, но в пределах для __init__ вы можете указать пустую метку.

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['division'].empty_label = 'default'   
...