【问题标题】:Django: CreateView don't show field and set it to request.user (ForeignKey)Django:CreateView不显示字段并将其设置为request.user(ForeignKey)
【发布时间】:2019-02-01 09:06:57
【问题描述】:

我使用通用的 CreateView 让登录用户(创建者)添加模型片段的对象。由于创建 Piece 是由 Creator(登录用户)完成的,因此 CreateView 不需要显示或操作“creator”字段。因此,我希望不显示它并将其设置为登录用户。但是,覆盖 form_valid 或使用 get_form_kwargs 等方法似乎无法完成。使用 form_valid 方法会产生 ValueError:

Cannot assign "<SimpleLazyObject: <User: patrick1>>": "Piece.creator" must be a "Creator" instance.

我希望,解决方案似乎指日可待。

试过但没用: form_valid methodform_valid methodget_form_kwargs method

我的代码:

models.py

class Piece(models.Model):
    creator = models.ForeignKey('Creator', on_delete=models.SET_NULL, null=True)
    title = models.CharField(max_length=200)
    summary = models.TextField(max_length=1000, help_text='Enter a brief description of the Piece')
    created = models.DateField(null=True, blank=True)
    ...

from django.contrib.auth.models import User
class Creator(models.Model):
    ...
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ...

views.py

class PieceCreate(LoginRequiredMixin, CreateView):
    model = Piece
    fields = ['title', 'summary', 'created']
    initial = {'created': datetime.date.today()}

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.creator = self.request.user
        return super(PieceCreate, self).form_valid(form)

    success_url = reverse_lazy('pieces')

非常感谢任何建议!

【问题讨论】:

    标签: python django


    【解决方案1】:
    obj.creator = Creator.objects.get(user=self.request.user)
    

    或任何其他可以为当前用户提供Creator 实例而不是User 的解决方案。正如错误消息所说。

    无法分配“用户:patrick1”:“Piece.creator”必须是“Creator”实例。

    【讨论】:

    • 谢谢。还指出错误消息实际上提供了关键提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多