【问题标题】:how to pass the an authenticated user to forms.py in django如何将经过身份验证的用户传递给 django 中的 forms.py
【发布时间】:2017-05-26 20:45:10
【问题描述】:

我有一个 django 应用程序,每个注册用户都可以使用它创建类别。对于身份验证,我使用 django-all-auth。我的models.py 看起来像这样:

class Profile(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    create_date = models.DateTimeField('date added', auto_now_add=True)
    modify_date = models.DateTimeField('date modified', default=timezone.now)

class Category(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(Profile, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, unique=True)
    create_date = models.DateTimeField('date added', auto_now_add=True)
    modify_date = models.DateTimeField('date modified', default=timezone.now)

在索引页面上,用户可以看到创建的类别并创建新的类别。 views.py:

def CategoryView(request):
    user = 0
    if request.user.is_authenticated():
        user = request.user
    form = CategoryNameForm()
    form.user = user
    context = {
        'categories': Category.objects.all(),
        'form': form,
        'user':user,
        }
    if request.method == 'POST':
        form = CategoryNameForm(request.POST)
        form.user = user
        if form.is_valid():
            form.save()
    return render(request, 'myapp/index.html',context) 

forms.py: 类 CategoryNameForm(forms.ModelForm):

    class Meta:
        model = Category
        fields = ('name',)

身份验证有效。所以我想把用户字段传递到表单中:

class CategoryNameForm(forms.ModelForm):

        class Meta:
            model = Category
            fields = ('name','user',)

隐藏它然后,只需通过 JS 选择它,因为用户在上下文中。我只是想知道是否有更简单的方法。这个 form.user = user 出于某种原因不起作用,我得到一个 NOT NULL 约束失败

【问题讨论】:

  • 所以你想确保刚刚登录的用户可以访问? view.py 文件中的@login_required 怎么样?

标签: django authentication django-forms


【解决方案1】:

有几种方法,但这里是一种:

class CategoryNameForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = ('name',)  # take out user you don't need it here

    def save(self, **kwargs):
        user = kwargs.pop('user')
        instance = super(CategoryNameForm, self).save(**kwargs)
        instance.user = user
        instance.save()
        return instance

然后在视图中:

if form.is_valid():
    form.save(user=request.user, commit=False)

确保您的CategoryView 只能由经过身份验证的用户访问。否则你仍然会得到用户的 NOT NULL 约束失败。

【讨论】:

  • 这行得通,非常感谢,我不得不将这一行改为instance.user = Profile.objects.get(user=user)
  • 是的,正确,被您的命名约定弄糊涂了 :) P.S 您也可以这样做 instance.user = user.profile
  • 这太可怕了,有什么建议可以让我更好地学习命名约定吗?
  • 您只需要考虑更多 :) 您有 ForeignKey to Profile 但列名是用户,这没有意义吗? (除非您有充分的理由或需要)profile = models.ForeignKey(Profile) 更有意义。对于 Python 编码指南,您可以检查 pep-8 并根据一些指南验证您的文件,您可以使用 pycodestyle
猜你喜欢
  • 2019-07-06
  • 1970-01-01
  • 2020-01-17
  • 2020-01-13
  • 2020-11-15
  • 2016-11-30
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
相关资源
最近更新 更多