Получить значение id из ModelChoiceField, которое передается модели - PullRequest
0 голосов
/ 08 июня 2018

form.py

class CreateForm(forms.ModelForm):
      parent_id = forms.ModelChoiceField(queryset=Category.objects.all(), required = False)
      name = forms.CharField(max_length = 100)

      class Meta:
         model = Category
         fields = ('parent_id', 'name') 

models.py

class Category(models.Model):
    parent_id = models.IntegerField()
    name = models.CharField(max_length = 50)

    def __str__(self):
        return self.name

view.py

class CreateView(TemplateView):
    template_name = 'create.html'

    def get(self, request):
        form = CreateForm()
        return render(request, self.template_name, {'form' : form})

    def post(self, request):
        form = CreateForm(request.POST)
        if form.is_valid:
            form.save()

        return render(request, self.template_name, {'form' : form})

Форма создается в шаблоне в create.html html page

Моя проблема заключается в том, что я выбираю категорию из выпадающего списка ModelChoiceField для parent_id в create.htmlЯ получаю объект, а не Id.Вот почему он отображает ошибку «[имя поля] должно быть целым числом» и не может передать значение в базу данных, поскольку parent_id объявлен как Integer в models.py.Мне нужно получить идентификатор выбранного значения и передать его в базу данных в поле «parent_id».Я знаю кое-что, что работает в поле зрения:

# parent_id = form.cleaned_data('parent_id').id 

Я получил идентификатор таким способом, но он не помог мне, потому что form.save () не будет ничего брать из вида.он работает напрямую с form.py и просто сохраните его здесь.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Как я уже упоминал в комментариях, просто используйте ForeignKey (отношение многие-к-одному) вместо непосредственного сохранения идентификатора с помощью parent_id .Django сделает все за вас.

class Category(models.Model):
    <s>parent_id = models.IntegerField()</s>
    <b>parent</b> = models.ForeinKey("self",<b>on_delete=models.SET_NULL,blank=True,null=True)</b> 
    # name it parent
    name = models.CharField(max_length = 50)

    def __str__(self):
        return self.name

Ваша форма станет такой:

class CreateForm(forms.ModelForm):
      <b>parent</b> = forms.ModelChoiceField(queryset=Category.objects.all(), required = False)
      name = forms.CharField(max_length = 100)

Тогда все готово, вы сохраняете форму и создаете экземпляр как родительскийCategory Сам экземпляр.

0 голосов
/ 08 июня 2018

Вы можете переименовать parent_id поле формы в parent.Поэтому form.save() будет ожидать родительский экземпляр:

class CreateForm(forms.ModelForm):
      parent = forms.ModelChoiceField(queryset=Category.objects.all(), required = False)
      name = forms.CharField(max_length = 100)

      class Meta:
         model = Category
         fields = ('parent', 'name') 

Обратите внимание, parent должно быть ForeignKey.

модели.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...