我有一个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约束失败
答案 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约束失败。