Использование 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)
Ответы
Ответ 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()