我遇到了登录用户和Django ModelForm
的问题。我有一个名为_Animal_
的类,它有一个指向User
的ForeignKey
和一些与动物相关的数据,比如年龄、种族等。
用户可以将动物添加到数据库中,我必须跟踪每个动物的作者,因此我需要添加在用户创建动物实例时记录的request.user。
models.py
class Animal(models.Model):
name = models.CharField(max_length=300)
age = models.PositiveSmallIntegerField()
race = models.ForeignKey(Race)
...
publisher = models.ForeignKey(User)
def __unicode__(self):
return self.name
class AnimalForm(ModelForm):
class Meta:
model = Animal
主要目标是隐藏表单中的publisher字段,并在单击保存按钮时提交登录的用户。
我可以使用initial
捕捉视图中的当前用户,但我还希望不显示该字段。
views.py
@login_required
def new_animal(request):
if request.method == "POST":
form = AnimalForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
else:
variables = RequestContext(request, {'form': form})
return render_to_response('web/animal_form.html', variables)
else:
form = AnimalForm(initial={'publisher': request.user})
variables = RequestContext(request, {'form': form})
return render_to_response('web/animal_form.html', variables)
发布于 2011-12-12 04:34:18
您只需将其从表单中排除,然后在视图中进行设置。
class AnimalForm(ModelForm):
class Meta:
model = Animal
exclude = ('publisher',)
..。在视图中:
form = AnimalForm(request.POST)
if form.is_valid():
animal = form.save(commit=False)
animal.publisher = request.user
animal.save()
(还要注意,第一个else
子句-紧跟在重定向之后的行-是不必要的。如果省略它,执行将会落到视图末尾的两行,这两行是完全相同的。)
发布于 2013-01-04 21:00:06
另一种方式(略短):
您还需要排除该字段:
class AnimalForm(ModelForm):
class Meta:
model = Animal
exclude = ('publisher',)
然后在视图中:
animal = Animal(publisher=request.user)
form = AnimalForm(request.POST, instance=animal)
if form.is_valid():
animal.save()
发布于 2018-08-06 23:56:52
我会将其直接添加到表单中:
class AnimalForm(ModelForm):
class Meta:
model = Animal
exclude = ('publisher',)
def save(self, commit=True):
self.instance.publisher = self.request.user
return super().save(commit=commit)
在我看来,这是最干净的版本,您可以在不同的视图中使用该表单。
https://stackoverflow.com/questions/8466768
复制相似问题