Как добавить поле Foreginkey в форму регистрации? - PullRequest
0 голосов
/ 27 августа 2018

Я создаю форму регистрации. Я унаследовал класс регистрации. Хотелось бы добавить список выбора (ключ foregin) .am Ошибка получения.

model.py

class Branch(models.Model):
    status = (
        ('active', 'Active'),
        ('shutdown', 'Shutdown'),
        ('opensoon', 'Opening Soon'),
    )
    branch_name = models.CharField(max_length=10, unique=True)
    availablity_status = models.CharField(choices=status, default='available', max_length=13 )
    branch_state = models.CharField(max_length=20, name='State')

    def __str__(self):
        return self.branch_name

form.py

class SignUpForm(UserCreationForm):
    branch_name = forms.ForeignKey(Branch, on_delete=models.CASCADE)

    class Meta:
        model = User
        fields = ('username','branch_name','password1','password2')
        widgets = {
         'username': forms.TextInput(attrs={'size': 15, 'placeholder':     'Username'})
    }

Ошибка:

 branch_name = forms.ForeignKey(Branch, on_delete=models.CASCADE)
 AttributeError: module 'django.forms' has no attribute 'ForeignKey'

Ответы [ 2 ]

0 голосов
/ 27 августа 2018
class SignUpForm(UserCreationForm):
   branch_name = forms.ModelChoiceField(queryset=Branch.objects.all())

  class Meta:
      model = User
      fields = ('username','branch_name','password1','password2')
      widgets = {
         'username': forms.TextInput(attrs={'size': 15, 'placeholder':     'Username'})
    }

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

class SignUpForm(UserCreationForm):
       branch_name = forms.ChoiceField(choices=[(o.id, str(o)) for o in Branch.objects.all()])

      class Meta:
          model = User
          fields = ('username','branch_name','password1','password2')
          widgets = {
             'username': forms.TextInput(attrs={'size': 15, 'placeholder':     'Username'})
        }
0 голосов
/ 27 августа 2018

Решение :

Для этого конкретного запроса вам нужно будет использовать ModelChoiceField, как указано ниже, не забывая передавать набор запросов для объектов, которые вы хотите, чтобы ваш пользовательвыберите из.

Итак, я бы изменил ваш forms.py на:

class SignUpForm(UserCreationForm):
    ...
    branch_name = forms.ModelChoiceField(queryset = Branch.objects.all())
    ...

... или если вам нужно выбрать несколько ветвей:

class SignUpForm(UserCreationForm):
    ...
    branch_name = forms.ModelMultipleChoiceField(queryset = Branch.objects.all())
    ...

Дополнительный Pro-Tip , расширение ModelChoiceField:

Вы можете даже добавить следующее, если не хотите отображать толькоPrimaryKey / ID (pk) модели Branch (вернее, возвращающий branch_name):

fields.py:

from django.forms import ModelChoiceField

class MyBranchModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "Branch: #%i" % obj.branch_name

Затем используйте аналогичные выше:

branch_name = forms.MyBranchModelChoiceField(queryset = Branch.objects.all())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...