无法在视图中设置 Django 表单的字段值

Posted

技术标签:

【中文标题】无法在视图中设置 Django 表单的字段值【英文标题】:Cannot set a field value of a Django form in views 【发布时间】:2021-08-04 01:49:05 【问题描述】:

我正在制作一个待办事项网站,不同的用户可以在其中登录并拥有各自的待办事项列表,但是当用户登录并将任务添加到列表中时,该任务不会分配给任何用户,因此尽管存在在数据库中,它不会显示在用户列表中。

我正在尝试在提交表单后将表单对象(task_form) 分配给用户,我认为这是问题所在,但我不知道还能尝试什么。

views.py

@login_required(login_url='todo:login')
def task_add(request):
    if(request.method == "POST"):
        task_form = AddTask(request.POST)
        if(task_form.is_valid()):

            task_form.cleaned_data['user'] = request.user #trying to assign a user after all the data has been populated

            task_form.save()
            return redirect('todo:index')
    return render(request,'todo/task_add.html')

模板(task_add.html)

% block body %
    <form method="POST">
        % csrf_token %
        <p><label for="title">Title</label>
        <input type="text" name="title"></p>
        <p><label for="desc">Description</label>
        <input type="text" name="desc"></p>
        <p><label for="start_time">Time</label>
        <input type="datetime-local" name="start_time"></p>
        <p><label for="completed">Complete</label>
        <input type="radio" name="completed"></p>
        <input type="submit" value="Add" name="submit" class="btn btn-success">
    </form>
% endblock %

models.py

class Task(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True)
    title = models.CharField(max_length=50)
    desc = models.CharField(max_length=100,null=True,blank=True)
    start_time = models.DateTimeField(auto_now=False,auto_now_add=False,null=True,blank=True)
    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.title

forms.py

class AddTask(forms.ModelForm):
    class Meta:
        model = Task
        fields = '__all__'

【问题讨论】:

【参考方案1】:

可以设置.instance.user属性包裹在表单中:

@login_required(login_url='todo:login')
def task_add(request):
    if request.method == 'POST':
        task_form = AddTask(request.POST)
        if task_form.is_valid():
            task_form.instance.user = request.user
            task_form.save()
            return redirect('todo:index')
    return render(request,'todo/task_add.html')

【讨论】:

谢谢,成功了!!!但是,为什么我的方法不起作用? @PoseidonBroger:因为如果该字段不在fields 中,Django 将跳过它:github.com/django/django/blob/main/django/forms/… 您还设置了 thje user = blank & null = True 意味着它是可选的。因此,当您在没有它的情况下保存任务时,它不会抱怨。你没有工作的原因是你没有在表格上改变它,你正在访问cleaned_data,我认为你不能改变它。 @WillemVanOnsem 我这样更改了我的字段-fields = ('user','title','desc','start_time','completed'),但它似乎仍然不起作用。我认为我们无法更改cleaned_data。 @AppHandwerker 我也这么认为

以上是关于无法在视图中设置 Django 表单的字段值的主要内容,如果未能解决你的问题,请参考以下文章

如何在渲染django模板时动态设置表单选择字段的初始值

如何根据决策(布尔)字段在现有表单的视图中设置默认值?

使用 Django,如何在模板中动态设置 ModelForm 字段值?

Django在视图中从db查询初始表单值。

根据值在 Admin 中自定义 Django 表单字段

Django:如何在管理视图中为 readonly_field 设置默认随机值?