Джанго формы и установить начальное значение для входа в систему пользователя? - PullRequest
0 голосов
/ 27 марта 2012

У меня есть такая форма:

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()

Эта форма отображается только для пользователей, которые вошли в систему, как я могу установить 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)

Вот мой взгляд и для этой формы:

@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)

Я подумал, может быть, мне следует создать скрытое поле и сохранитьтам есть request.user, но это не кажется безопасным, поскольку его легко редактировать с помощью firebug и тому подобного.Любые предложения относительно того, как я могу сохранить request.user для этой формы?

Спасибо!

1 Ответ

5 голосов
/ 27 марта 2012

Текущий пользователь будет представлен в запросе как 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")

Тогда по вашему мнению:

...
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'))
     ...
...