Django - 部分验证表单

1 投票
1 回答
808 浏览
提问于 2025-04-15 22:30

我刚接触Django,正在尝试处理一些表单。

我有一个表单,用来输入信息(创建一个新广告),在一个模板里:


class Ad(models.Model):
    ...
    category = models.CharField("Category",max_length=30, choices=CATEGORIES)
    sub_category = models.CharField("Subcategory",max_length=4, choices=SUBCATEGORIES)
    location = models.CharField("Location",max_length=30, blank=True)
    title = models.CharField("Title",max_length=50)
    ...
-----------------------------------
class AdForm(forms.ModelForm):
    class Meta:
        model = Ad
    ...

我用“is_valid()”来验证,结果一切正常。

基本上,对于第二次验证(在另一个模板里),我只想验证“category”和“sub_category”这两个字段:

在另一个模板中(用views.py里的另一个方法),我想用同一个表单里的“category”和“sub_category”这两个字段来过滤信息——但是现在“is_valid()”方法不能正确工作,因为它会验证整个表单,而我只想验证这两个字段。我试过以下方法:


   ...
   if request.method == 'POST': # If a filter for data has been submitted:
       form = AdForm(request.POST)
       try:
           form = form.clean()
           category = form.category
           sub_category = form.sub_category
           latest_ads_list = Ad.objects.filter(category=category)
       except ValidationError:
           latest_ads_list = Ad.objects.all().order_by('pub_date')
   else:
       latest_ads_list = Ad.objects.all().order_by('pub_date')
       form = AdForm()
   ...

但是没有效果。

编辑: 我通过添加以下内容解决了这个问题:


class FilterForm(forms.ModelForm):
    class Meta:
        model = Ad
        fields = ('category', 'sub_category')

然后用“is_valid()”等来验证这个表单,结果一切正常。

1 个回答

2

你有没有试过创建一个新的类来继承 AdForm,然后在里面的 Meta 类里修改 fields 呢?可以像这样做:

class AdFormLite(AdForm):
    class Meta:
        fields = ['category', 'sub_category']

ModelForm 的文档中,有关于 如何改变字段顺序 的说明:

fields 属性定义了你想要显示的模型字段的子集,以及它们显示的顺序。

撰写回答