【问题标题】:How do I check the validation of several forms in a list?如何检查列表中多个表单的验证?
【发布时间】:2019-04-24 12:40:46
【问题描述】:

对于个人项目,我有一个重新组合多个 froms 的视图。出于空间原因,必须列出一个列表,在该列表中,我根据数据库中的数据添加了一些表单。所以我的问题是:如何检查列表中存在的那些表单的验证。

这是我的看法:

def confirmation_view(request, id ,*args, **kwargs):
    tournament = Tournament.objects.get(pk=id)
    sport = tournament.sport
    rule = Rule.objects.get(tournament=tournament)
    categories = Category.objects.filter(tournament=tournament)
    form_tournament = TournamentCreationForm(request.POST or None, instance=tournament)
    form_sport      = SportEditForm(request.POST or None, instance=sport)
    form_rule       = RuleForm(request.POST or None, instance=rule)

    enum = 1
    tab_form_category = []
    for category in categories:
        form_category = CategoryForm(request.POST or None, instance=category)
        tab_form_category.insert(enum, form_category)
        enum = enum + 1

    if form_tournament.is_valid() and form_sport.is_valid() and form_rule.is_valid():
        return redirect('tournament')
    context = {
        'form_tournament': form_tournament,
        'form_sport': form_sport,
        'form_rule': form_rule,
        'tab_form_category': tab_form_category
    }
    return render(request, 'confirmation.html', context)

我说的是“tab_form_category”。

我没有足够的 Python 和 Django 经验,无法自行推断解决方案。

编辑:

这是我的类别模型:

class Category(models.Model):
    description = models.CharField(max_length=128)
    tournament  = models.ForeignKey(Tournament, default=None, on_delete=models.CASCADE)

【问题讨论】:

  • form_category.is_valid() 就足够了.....它将返回 TrueFalse
  • 列表中有几个表格就够了吗?我必须检查所有表格是否有效?
  • 您可以在将它们添加到tab_form_category 列表之前调用 is_valid() 方法。因此,您将拥有有效的表格

标签: django django-forms django-validation


【解决方案1】:

Forms.py

CategorySubForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = ['description']

TournamentCategoryFormset = forms.inlineformset_factory(Tournament, Category, form=CategorySubForm, min_num=1, extra=0, can_delete=False)

查看.py

def confirmation_view(request, id ,*args, **kwargs):
    tournament = Tournament.objects.get(pk=id)
    sport = tournament.sport
    rule = Rule.objects.get(tournament=tournament)
    form_tournament = TournamentCreationForm(request.POST or None, instance=tournament)
    form_sport      = SportEditForm(request.POST or None, instance=sport)
    form_rule       = RuleForm(request.POST or None, instance=rule)
    category_formset = TournamentCategoryFormset(request.POST or None, instance=tournament)

    if form_tournament.is_valid() and form_sport.is_valid() and form_rule.is_valid() and if category_formset.is_valid() :
        category_formset.save()
        return redirect('tournament')

    context = {
        'form_tournament': form_tournament,
        'form_sport': form_sport,
        'form_rule': form_rule,
        'tab_form_category': tab_form_category
        'categories' : category_formset
    }
    return render(request, 'confirmation.html', context)

在您的模板中:

{% for category_form in  categories%}
    {{category_form.as_p}} 

{% endfor %}
{{categories.management_form}}

编辑:

在您的情况下,您需要查看 inlineFormset:https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#inline-formsets 它旨在与相关表单一起使用(您将为与锦标赛相关的每个类别都有一个子表单)。

如果您在锦标赛和类别之间使用多对多,则需要关联中间表(通过)

【讨论】:

  • 基本上,我正在创建一个锦标赛,一个锦标赛可以有几个类别。在编辑锦标赛时,我需要能够编辑与锦标赛关联的类别。每个类别都是一个表单,这就是为什么我想知道如何验证 tab_form_category 中的每个表单。我尝试了你发送的内容,但它不起作用。如果我更改一个类别,它也会更改所有其他类别。
  • 我发现用table的方法比较简单。只是这个:for category_form in tab_form_category: if category_form.is_valid(): category_form.save() 不起作用。如果我编辑并保存,它将更改与锦标赛相关的所有类别
  • 内联表单集看起来实现起来更复杂,但您最终会得到更健壮和可维护的代码。如果你分享你的models.py的数据结构,我可以帮你做到这一点
  • 我刚刚编辑了答案以坚持你的情况,但我不明白你的验证部分(你不保存 form_tournament、form_sport 和 form_rule)
  • 我的验证部分没有完成,为什么它是空的,但我当然要保存其他表单。我理解了 inlineformset 部分,所以一切都很好!
猜你喜欢
  • 2014-12-27
  • 2021-04-05
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多