Bri*_*ian 29 django django-generic-views django-class-based-views
所以我的模型包括:
class Place(models.Model):
....
created_by = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
我的观点是这样的:
class PlaceFormView(CreateView):
form_class = PlaceForm
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceFormView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
有没有办法让我访问request.user并将created_by设置为该用户?我查看了文档,但似乎无法找到任何暗示.
`
Yuj*_*ita 30
如何覆盖form_valid哪种形式可以节省?自己保存,做任何你想做的事,然后做重定向.
class PlaceFormView(CreateView):
form_class = PlaceForm
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceFormView, self).dispatch(*args, **kwargs)
def form_valid(self, form):
obj = form.save(commit=False)
obj.created_by = self.request.user
obj.save()
return http.HttpResponseRedirect(self.get_success_url())
Run Code Online (Sandbox Code Playgroud)
ral*_*okt 16
我知道这是旧的,但对于有这个问题的其他人:
有一种更简单的方法 - 由于多次保存表单将始终使用相同的模型实例,您还可以执行以下操作:
def form_valid(self, form):
obj = form.save(commit=False)
obj.created_by = self.request.user
return super(PlaceFormView, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)
这样,你就可以获得超级调用的所有好处 - 看到你真的只添加这两行代码是微不足道的,而且你不必通过复制重定向逻辑来重复自己.
另一种方法是通过覆盖 CreateView 中的 get_initial() 方法来传递用户,并修改 PlaceForm 类中的 save 方法来保存用户:
class PlaceForm(forms.ModelForm):
...
...
...
def __init__(self, *args, **kwargs):
self.created_by = kwargs['initial']['created_by']
super(PlaceForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
obj = super(PlaceForm, self).save(False)
obj.created_by = self.created_by
commit and obj.save()
return obj
class PlaceFormView(CreateView):
...
...
form_class = PlaceForm
def get_initial(self):
self.initial.update({ 'created_by': self.request.user })
return self.initial
Run Code Online (Sandbox Code Playgroud)
这样,保存逻辑仍然封装在表单类中。
| 归档时间: |
|
| 查看次数: |
17470 次 |
| 最近记录: |