Подтвердить что ты не робот

Использование request.user с Django ModelForm

У меня проблема с зарегистрированными пользователями и Django ModelForm. У меня есть класс с именем _Animal_, который имеет от ForeignKey до User и некоторые данные, относящиеся к животному типа возраста, расы и т.д.

Пользователь может добавить Животные в db, и мне нужно отслеживать автора каждого животного, поэтому мне нужно добавить 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)
4b9b3361

Ответ 1

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

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

Ответ 2

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

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