Как управлять формой с промежуточными полями таблицы "многие ко многим" и представлениями на основе классов?
Я хотел бы иметь возможность редактировать статью непосредственно через веб-страницу, на которой она отображается. Для этого я использую UpdateView. Моя модель "News" имеет отношения "многие ко многим" с моей моделью "User". Промежуточная модель называется "NewsUpdate" и имеет 2 дополнительных поля (update_date и update_reason). Я могу отобразить и запустить форму редактирования моей модели "News", но я не могу добавить поле "update_reason" и проверить его. Возможно ли это сделать с помощью общих представлений?
Заранее спасибо!
модели :
class News(models.Model):
...
image = models.ImageField(upload_to='contents', null=True, blank=True)
uuid = models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID')
author = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='Auteur', related_name='create_news')
news_update_user = models.ManyToManyField(AUTH_USER_MODEL, through='contents.NewsUpdate', related_name='news_update_user')
news_delete_user = models.ManyToManyField(AUTH_USER_MODEL, through='contents.NewsDelete', related_name='news_delete_user')
class NewsUpdate(models.Model):
news = models.ForeignKey(News, on_delete=models.CASCADE, related_name='updated_news')
updater = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='Auteur', related_name='news_updater')
update_date = models.DateTimeField(auto_now=True, null=True, verbose_name='Modification le')
update_reason = models.CharField(max_length=250, verbose_name='Raison de la modification')
class Meta:
unique_together = ('news', 'updater')
class User(AbstractUser):
first_name = models.CharField(
max_length=30,
blank=True,
null=True,
verbose_name='Prénom'
)
last_name = models.CharField(
max_length=30,
blank=True,
null=True,
verbose_name='Nom'
)
...
Просмотр обновления новостей :
class NewsUpdateView(SuccessMessageMixin, UpdateView):
model = News
template_name = 'contents/news_update.html'
success_message = 'La news a bien été mise à jour !'
fields = ['category', 'title', 'content', 'image', 'status']
def get_object(self, queryset=None):
# To use uuid in the route
return News.objects.get(uuid=self.kwargs.get("uuid"))
def form_valid(self, form):
form.instance.author = self.request.user
self.object = form.save(commit=False)
NewsUpdate.objects.filter(news=self.object).delete()
for user in form.cleaned_data['news_update_user']:
news_update = NewsUpdate()
news_update.news = self.object
news_update.updater = user
news_update.save()
return super(ModelFormMixin, self).form_valid(form)
новостные урлы :
urlpatterns = [
path(route='news/', view=views.NewsListView.as_view(), name='news-list'),
path(route='news/<uuid:uuid>/', view=views.NewsDetailView.as_view(), name='news-detail'),
path(route='news/create/', view=views.NewsCreateView.as_view(), name='news-create'),
path(route='news/<uuid:uuid>/update', view=views.NewsUpdateView.as_view(), name='news-update'),
path(route='news/<uuid:uuid>/delete', view=views.NewsDeleteView.as_view(), name='news-delete'),
...
]
HTML форма :
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="profile-btn profile-update-validate-btn">Valider</button>
<input type="button" name="cancel" value="Annuler"
onclick="window.location.href='{% url 'news-detail' uuid=news.uuid %}';"
class="profile-btn profile-update-cancel-btn">
</form>