django class-based view-UpdateView - как получить доступ к пользователю запроса при обработке формы?
В class-base UpdateView в Django я исключаю поле пользователя, поскольку оно является внутренним для системы, и я не буду просить его. Теперь, каков правильный способ Django передачи пользователя в форму. (Как я это делаю сейчас, я передаю пользователя в init формы, а затем переопределить метод save() формы. Но я уверен, что есть правильный способ сделать это. Что-то вроде скрытого поля или чего-то в этом роде.
# models.py
class Entry(models.Model):
user = models.ForeignKey(
User,
related_name="%(class)s",
null=False
)
name = models.CharField(
blank=False,
max_length=58,
)
is_active = models.BooleanField(default=False)
class Meta:
ordering = ['name',]
def __unicode__(self):
return u'%s' % self.name
# forms.py
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
exclude = ('user',)
# views.py
class UpdateEntry(UpdateView):
model = Entry
form_class = EntryForm
template_name = "entry/entry_update.html"
success_url = reverse_lazy('entry_update')
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(UpdateEntry, self).dispatch(*args, **kwargs)
# urls.py
url(r'^entry/edit/(?P<pk>d+)/$',
UpdateEntry.as_view(),
name='entry_update'
),
3 ответов
взлом, как передача скрытого поля, не имеет смысла, поскольку это действительно не имеет ничего общего с клиентом - эта классическая проблема "ассоциируется с зарегистрированным пользователем", безусловно, должна обрабатываться на стороне сервера.
Я бы поставил это поведение в form_valid
метод.
class MyUpdateView(UpdateView):
def form_valid(self, form):
instance = form.save(commit=False)
instance.user = self.request.user
super(MyUpdateView, self).save(form)
# the default implementation of form_valid is...
# def form_valid(self, form):
# self.object = form.save()
# return HttpResponseRedirect(self.get_success_url())
должен возвращать объект HttpResponse. Код ниже работает:
class MyUpdateView(UpdateView):
def form_valid(self, form):
instance = form.save(commit=False)
instance.user = self.request.user
return super(MyUpdateView, self).form_valid(form)
мы также можем сделать как
class MyUpdateView(UpdateView):
form_class = SomeModelForm
def form_valid(self, form):
form.instance.user = self.request.user
return super(MyUpdateView, self).form_valid(form)