Использование request.user с Django ModelForm - PullRequest
18 голосов
/ 11 декабря 2011

У меня проблема с зарегистрированными пользователями и Django 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)

Ответы [ 3 ]

35 голосов
/ 12 декабря 2011

Вам просто нужно исключить его из формы, а затем установить его в представлении.

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 - строки, следующие непосредственно за перенаправлением, - не нужно. Если вы пропустите его, выполнение упадет до двух строк в конце представления, которые идентичны.)

8 голосов
/ 04 января 2013

Другой способ (немного короче):
Вам также необходимо исключить поле:

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()
0 голосов
/ 06 августа 2018

Я бы добавил это прямо в форму:

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)

Это, на мой взгляд, самая чистая версия, и вы можете использовать форму в разных представлениях.

...