无法在视图中设置 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 表单的字段值的主要内容,如果未能解决你的问题,请参考以下文章