Django为登录用户形成并设置初始值?

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的任何建议?

谢谢!

Tim*_*ony 5

当前用户将出现在请求中,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)