【问题标题】:Django forms are not saving any informationDjango 表单不保存任何信息
【发布时间】: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 做什么。

标签: python django web


【解决方案1】:

这并不优雅,但您可能只需要这样做:

data = Activity.objects.get(author=request.user)
data.is_complete = form.cleaned_data["is_complete"]
data.save()

请删除form.save()并写上上面的代码。 我不确定这是否有效,但请试一试。

【讨论】:

  • 成功了,但你能解释一下为什么之前没有成功吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2014-05-19
  • 2017-04-18
相关资源
最近更新 更多