【问题标题】:Migrate form to modelform将表单迁移到模型表单
【发布时间】:2017-07-08 23:21:08
【问题描述】:

我写了以下表格:

class VoteForm(forms.Form):
    choice = forms.ModelChoiceField(queryset=None, widget=forms.RadioSelect)

    def __init__(self, *args, **kwargs):
        question = kwargs.pop('instance', None)
        super().__init__(*args, **kwargs)

        if question:
            self.fields['choice'].queryset = question.choice_set

class VoteView(generic.UpdateView):
    template_name = 'polls/vote.html'
    model = Question
    form_class = VoteForm

    def get_queryset(self):
        return Question.objects.filter(pub_date__lte=timezone.now()).exclude(choice__isnull=True)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Check duplicate vote cookie
        cookie = self.request.COOKIES.get(cookie_name)
        if has_voted(cookie, self.object.id):
            context['voted'] = True
        return context

    def get_success_url(self):
        return reverse('polls:results', args=(self.object.id,))

    def form_valid(self, form):
        redirect = super().form_valid(form)

        # Set duplicate vote cookie.
        cookie = self.request.COOKIES.get(cookie_name)
        half_year = timedelta(weeks=26)
        expires = datetime.utcnow() + half_year
        if cookie and re.match(cookie_pattern, cookie):
            redirect.set_cookie(cookie_name, "{}-{}".format(cookie, self.object.id), expires=expires)
        else:
            redirect.set_cookie(cookie_name, self.object.id, expires=expires)

        return redirect

问题是普通形式不代表一个对象没有像ModelForm那样的save()方法。但我不知道如何迁移表单。没有choice或choice_set字段:

class VoteForm(forms.ModelForm):
    class Meta:
        Model = Question
        #throws exception
        fields = ('choice',)
        widgets = {
            'choice': forms.RadioSelect()
                   }

编辑: 以下是模型:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

如何将上面的表格复制为模型表格?

【问题讨论】:

  • 请出示您的型号。
  • 我添加了模型。

标签: django forms django-forms modelform


【解决方案1】:

即使您有 ModelForm,您也可以在需要时定义其他字段。在您的情况下,它将是以前正常形式中的选择字段。

然后在 Meta 中,您将排除 Question 模型中所有不需要的字段。

在 init 之后,您将为选择字段提供所提供实例的选择集。

class VoteForm(forms.ModelForm):
    choice = forms.ModelChoiceField(queryset=None, widget=forms.RadioSelect)

    class Meta:
        model = Question
        exclude = ['question_text','pub_date']

    def __init__(self, *args, **kwargs):
        super(VoteForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance:
            self.fields['choice'].queryset = instance.choice_set

代码是网上写的,没有测试,但我觉得应该可以。

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多