tde*_*lam 0 django django-forms django-views
我有一个这样的表格:
from django import forms
from django.contrib.auth.models import User
from django_countries.countries import COUNTRIES
from statuses.models import Status
class StatusForm(forms.Form):
country = forms.ChoiceField(choices=COUNTRIES)
mood = forms.IntegerField()
sleep_quality = forms.IntegerField()
Run Code Online (Sandbox Code Playgroud)
此表单仅显示给登录的用户,如何设置request.user以便在用户提交此表单时,我可以将表单条目与它们关联?我的模型与用户FK类似:
from django.db import models
from django.contrib.auth.models import User
from django_countries import CountryField
class Status(models.Model):
user = models.ForeignKey(User)
country = CountryField()
mood = models.SmallIntegerField(default=4)
sleep_quality = models.SmallIntegerField(default=4)
Run Code Online (Sandbox Code Playgroud)
以下是我对此表单的看法:
@login_required
def index(request, template_name="status/index.html"):
if request.method == 'POST':
postdata = request.POST
form = StatusForm(postdata)
if form.is_valid():
messages.success(request, 'Something happened, good!')
return redirect(urlresolvers.reverse('profile'))
else:
form = StatusForm()
context = RequestContext(request, { 'form': form })
return render_to_response(template_name, context)
Run Code Online (Sandbox Code Playgroud)
我想也许我应该创建一个隐藏字段并在那里存储request.user但这似乎并不安全,因为它可以很容易地用firebug等进行编辑.关于如何为此表单存储request.user的任何建议?
谢谢!
当前用户将出现在请求中,request.user因此您无需将其包含在表单中.相反,为什么不利用ModelForms,因为他们将处理将对象链接到表单.
class StatusForm(forms.ModelForm):
country = forms.ChoiceField(choices=COUNTRIES)
# The other fields are automatically included, we just overwrite country
class Meta:
model = Status
exclude = ("user")
Run Code Online (Sandbox Code Playgroud)
然后在你看来:
...
form = StatusForm(request.POST):
if form.is_valid():
# Because your model requires that user is present, we validate the form and
# save it without commiting, manually assigning the user to the object and resaving
obj = form.save(commit=False)
obj.user = request.user
obj.save()
messages.success(request, 'Something happened, good!')
return redirect(urlresolvers.reverse('profile'))
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |