form.is_valid方法一直失败

时间:2015-03-04 06:06:30

标签: django

我试图为用户创建一个编辑页面来更新对象数据。但是,form.is_valid()一直在失败,我不知道为什么。

我的模特:

class Thread(models.Model):
    title = models.CharField(max_length=200)
    created = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User, blank=True, null=True)
    body = models.TextField(max_length=10000)

    USER_TYPES = (
            ('INI','Iniciante'),
            ('INT','Intermediário'),
            ('AVA','Avançado')
            )
    user_type = models.CharField(max_length=20, choices = USER_TYPES, default='INI')

    category = models.ForeignKey(Category)
    orcamento = models.IntegerField(default=0)
    slug = models.SlugField(max_length=40, unique=True)

    def get_absolute_url(self):
        return "/%s/" % self.slug

    def __str__(self):
        return self.title

    def save(self, **kwargs):
        slug_str = "%s %s" % (self.category, self.title)
        unique_slugify(self, slug_str)
        super(Thread, self).save(**kwargs)

我的观点:

def edit_thread(request, thread_slug):
    thread = Thread.objects.get(slug=thread_slug)
    if request.method == 'POST':
        form = EditThread(request.POST)
        if form.is_valid():
            thread.title = form.cleaned_data['title']
            thread.orcamento = form.cleaned_data['orcamento']
            thread.user_type = form.cleaned_data['experiencia']
            thread.body = form.cleaned_data['pergunta']
            thread.save()
            return HttpResponseRedirect('/thread' + thread.get_absolute_url())
    else:
        data = {'title' : thread.title, 'experiencia':thread.user_type, 'orcamento' : thread.orcamento, 'pergunta': thread.body}
        form = EditThread(initial=data)
        return render(request, 'edit_thread.html', {
                                'form': form })

我的表格:

class EditThread(forms.ModelForm):
    title = forms.CharField(label='Título', max_length=200, error_messages=my_default_errors)
    orcamento = forms.IntegerField(label='Preço máximo', error_messages=my_default_errors)
    experiencia = forms.ChoiceField(label='Você é um usuário...', choices=Thread.USER_TYPES, error_messages=my_default_errors)
    pergunta = forms.CharField(label='Pergunta', widget=forms.Textarea, error_messages=my_default_errors)

    class Meta:
        model = Thread

    def __init__(self, *args, **kwargs):
        super(EditThread, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.layout = Layout(
        Div('title',
        'experiencia',
        PrependedAppendedText('orcamento', 'R$', ',00', active=True),
        'pergunta',
        FormActions(
                Submit('save', 'Salvar alterações'),
       )))

访问页面时,表单会预先填充对象的数据。

2 个答案:

答案 0 :(得分:0)

您的表单应该继承简单forms.Form而不是forms.ModelForm

class EditThread(forms.Form):
    ...

答案 1 :(得分:0)

我建议你看看django的班级UpdateView。它可以为您生成更新表单,也可以通过覆盖视图中的form_class属性为其提供自定义ModelForm。使用ModelForm时,您还必须指定表单所针对的模型,例如:

class EditThread(forms.ModelForm):
    "field definitions ..."

    class Meta:
        model = Thread
        fields = ['my_field_1', 'my_field_2']