Вы можете указать атрибут .form_class
[Django -doc] в UpdateView
(а также в CreateView
). Таким образом, мы можем создать форму вроде:
# app/forms.py
from django import forms
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['image', 'title', 'category', 'status', 'description']
widgets = {
'image': …
}
Где вы замените …
на виджет, который вы хотите использовать для поля image
.
Затем вы можете подключить эту форму :
# app/views.py
from app.forms import <b>PostForm</b>
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
model = Post
<b>form_class = PostForm</b>
template_name = 'blog/post-form.html'
success_message = 'Your post has been updated.'
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
def get_context_data(self, **kwargs):
context = super(PostUpdateView, self).get_context_data(**kwargs)
context['title'] = 'Update post'
context['submit'] = 'Update'
return context
def get_success_url(self):
author = self.object.author
return reverse_lazy( 'profile', kwargs={'author': author.username})
За занавесками, если вы не укажете form_class
, Django просто сделает для вас один с modelform_factory
[Django -doc] , поэтому, используя другой ModelForm
, мы не меняем логику c использования формы.