【发布时间】:2021-10-11 14:11:03
【问题描述】:
所以我一直在尝试用 django 构建一个活动管理器,但我仍然处于起步阶段。我试图测试代码是否可以简单地显示活动是否完成,但它不会改变任何东西。一切对我来说都很好,我不知道错误是在表单中,在保存表单的视图中还是在其他任何地方。我已经尝试更改表单的小部件和字段,但没有成功。
models.py:
from django.db import models
from django.contrib.auth.models import User
class Activity(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=30)
is_complete = models.BooleanField()
def __str__(self):
return self.title
forms.py:
from .models import Activity
class ActivityUpdateForm(ModelForm):
class Meta:
model = Activity
fields = ['is_complete']
views.py:
from .models import Activity
from .forms import ActivityUpdateForm
def home(request):
acts = Activity.objects.all()
if request.method == 'POST':
form = ActivityUpdateForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('home')
else:
form = ActivityUpdateForm()
context = {
'acts': acts,
'form': form,
}
return render(request, 'diary/home.html', context)
模板:
{% for act in acts %}
<form method="POST">
{% csrf_token %}
<p>{{ act.title }}</p>
<p>Is complete: {{ act.is_complete }}</p>
{{ form }}
<p>{{ act.author }}</p>
<button type="submit">Submit</button>
</form>
{% endfor %}```
【问题讨论】:
-
form = ActivityUpdateForm(request.POST, instance=request.user)-- 因为您在ActivityUpdateForm上传递了一个用户实例,所以不会保存任何内容,但是此表单需要一个 activity 对象而不是 user 对象 -
我把
instance=request.user放在那里是因为django给了我一个错误,因为我没有通过作者。我怎样才能通过两者? -
一个用户可以有很多活动,因此您需要找到一种方法来获取要更新的活动。例如,如果你想获得第一个,你可以这样做:
instance=request.user.activity_set.first() -
@Noby 的回答会起作用,但如果用户有多个
Activity,它会失败 -
它也有效,非常感谢。直到现在我才对 object_set 做什么。