【问题标题】:Django form is being validated before it is submitted [duplicate]Django表单在提交之前正在被验证[重复]
【发布时间】:2020-05-18 04:18:26
【问题描述】:

我有一个显示在仪表板中的自定义引导表单。问题是,当用户进入仪表板时,他会立即看到验证错误,即使他还没有提交表单(文本字段应该是必需的)。

我不明白为什么会这样,感谢任何帮助! :) 问题图片(我不希望现在只在提交后显示红色的“必填字段”消息):

表格:

class MinitaskForm(forms.ModelForm):
    class Meta:
        model = Minitask
        fields = ()


    def __init__(
        self,
        data=None,
        files=None,
        auto_id="id_%s",
        prefix=None,
        initial=None,
        error_class=ErrorList,
        label_suffix=None,
        empty_permitted=False,
        instance=None,
        use_required_attribute=None,
        minitask=None,
    ):
        super().__init__(
            data,
            files,
            auto_id,
            prefix,
            initial,
            error_class,
            label_suffix,
            empty_permitted,
            instance,
            use_required_attribute,
        )

        assert minitask is not None

        self.fields["selected_choice"] = forms.CharField(
            widget=forms.RadioSelect(
                choices=[(val, val) for val in minitask.choices]
            ),
            required=False,
            label="Which of these emotions best describes your day?",
        )

        self.fields["reason"] = forms.CharField(label="Why?")

观看次数:

@login_required(login_url="login")
def dashboard(request):
    task = request.user.current_weekly_task()
    user_id = request.user.id
    solutions = Solution.objects.filter(user_id=user_id)
    minitask = request.user.current_minitask()
    minitasks = request.user.minitask_set.filter(selected_choice__isnull=False)

    if request.method == "POST":

        if "minitask" in request.POST:
            form = MinitaskForm(request.POST, minitask=minitask)
            if "selected_choice" not in request.POST:
                form.add_error("selected_choice", "Can't be blank")
                messages.error(request, "You must pick your today's emotion")
            if form.is_valid():
                minitask.reason = request.POST["reason"]
                minitask.selected_choice = request.POST["selected_choice"]
                minitask.user = request.user
                minitask.save()
                messages.success(request, "Your daily status has been updated.")

        return redirect("dashboard")
    else:
        mini_form = MinitaskForm(
            minitask=minitask,
            data={
                "reason": minitask.reason,
                "selected_choice": minitask.selected_choice,
            },
        )

    return render(
        request,
        "app/dashboard.html",
        {
            "solutions": solutions,
            "task": task,
            "mini_form": mini_form,
            "minitask": minitask,
            "minitasks": minitasks,
            "user": request.user,
        },
    )

模板:

<form method="POST" class="post-form">
  {% csrf_token %}
  {% bootstrap_form mini_form %}
  <button 
    type="Submit" 
    id="minitask-button" 
    class="save btn btn-pink" 
    name="minitask"
  >Save minitask</button>
</form>

【问题讨论】:

    标签: python django forms bootstrap-4


    【解决方案1】:

    在你看来:

    if request.method == "POST":
        ...
    else:
        mini_form = MinitaskForm(
            minitask=minitask,
            data={
                "reason": minitask.reason,
                "selected_choice": minitask.selected_choice,
            },
        )
    

    根据docs

    Form 实例要么绑定到一组数据,要么未绑定。

    大多数时候,表单通过POST 请求从用户那里获取数据。 (绑定形式)

    GET 请求为用户提供表单,以便用数据填充它。 (未绑定形式)

    因此,通过 GET 请求,需要向用户提供未绑定的表单。

    在您的代码中,您声明如果请求不是 POST(GET 请求不是 POST),则返回一个绑定表单,其中填充了您以编程方式提供的数据。

    这没有意义。

    如果您在else 之后插入breakpoint(),则可能会使用./manage.py runserver 呈现页面并输入控制台中提供的提示:

    minitask.reason == None 结果将是True

    以上,意味着您将表单与包含不允许的空原因的数据绑定。

    如果您想在unbound form 中提供初始数据,可以使用initial

    mini_form = MinitaskForm(
        minitask=minitask,
        initial={
            "reason": minitask.reason,
            "selected_choice": minitask.selected_choice,
        },
    )
    

    【讨论】:

    • 非常感谢,你解释得很好,我现在明白了:)谢谢!
    • @Zuzana 我很高兴能帮上忙。你也可以试试Blackblack ./*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多