我在登录用户和Django时遇到问题ModelForm。我有一个名为的类_Animal_,该类具有ForeignKeyto User和与该动物有关的一些数据,例如年龄,种族等。
ModelForm
_Animal_
ForeignKey
User
用户可以将动物添加到数据库,并且我必须跟踪每个动物的作者,因此我需要添加在用户创建动物实例时记录的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
主要目标是隐藏表单中的发布者字段,并在单击保存按钮时提交登录的用户。
我可以使用来在视图中捕获当前用户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)
你只需要从表单中排除它,然后在视图中进行设置即可。
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子句(紧随重定向之后的各行)是不必要的。如果不加说明,执行将落入视图末尾的两行,它们是相同的。)
else