如何将经过身份验证的用户传递给django中的forms.py

时间:2017-05-26 20:45:10

标签: django authentication django-forms

我有一个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:     class 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约束失败

1 个答案:

答案 0 :(得分: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约束失败。