python - 在 django Updateview 中保存表单集的问题
问题描述
我是 Django 和 Stackoverflow 的新手,所以如果我的代码不标准,请接受我的道歉。我尝试创建一个博客网站。用户可以创建和更新帖子,每个帖子可以有一个或多个类别或没有类别。我对 Post 使用 form,对 Category 使用 Formset。但是,由于某种原因,在 Updateview 中我无法保存表单集!!!!
模型.py
class Post(models.Model):
title = models.CharField(max_length=128)
text = models.TextField(blank=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
published_date = models.DateTimeField(blank=True, null=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
description = models.TextField(blank=True)
posts = models.ManyToManyField(Post,
blank=True,related_name='categories')
class Meta:
verbose_name_plural = 'Categories'
def __str__(self):
return self.name
表格.py
from django import forms
from blogging.models import Post, Category
class PostUpdateForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'text', 'published_date']
CATEGORY_CHOICES = [('', 'Choose from the list')]
for c in Category.objects.all():
CATEGORY_CHOICES.append((c, c))
class CategoryUpdateForm(forms.ModelForm):
class Meta:
model = Category
fields = ['name']
labels = {'name': 'Category'}
help_texts = {'name': 'Choose category for your post'}
widgets = {
'name': forms.Select(choices=CATEGORY_CHOICES)
}
CategoryFormset = forms.modelformset_factory(Category,
form=CategoryUpdateForm, extra=1,
max_num=3, can_delete=True)
视图.py
from blogging.models import Post, Category
from blogging.forms import PostUpdateForm, CategoryFormset
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
template_name = 'blogging/post_update.html'
form_class = PostUpdateForm
formset_class = CategoryFormset
def form_valid(self, form):
form.instance.author = self.request.user
context = self.get_context_data()
formset = context['formset']
if formset.is_valid():
category_form = formset.save(commit=False)
category_form.posts.add(self.get_object())
category_form.save()
formset.save()
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().get_context_data(**kwargs)
post = self.get_object()
if self.request.POST:
context['formset'] = self.formset_class(self.request.POST)
else:
context['formset'] =
self.formset_class(queryset=post.categories.all())
return context
模板
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Profile Info</legend>
{{ u_form | crispy }}
{{ p_form | crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info"
type="submit">Update</button>
</div>
</form>
解决方案
我能找到答案。通过使用extra-view包和使用CreateInlineView,UpdateInlineView都可以解决。https://django-extra-views.readthedocs.io/en/latest/
推荐阅读
- python - 不明白为什么我在 python 脚本中收到此错误
- r - 使用 dplyr/基函数 R 在组内随机选择观察值
- java - 为什么要使用@Query(“”)来操作Elasticsearch并报错(org.elasticsearch.common.ParsingException: no [query] registered for [query])
- tensorflow2.0 - 不规则张量的串联会引发值错误
- javascript - 在 React 中处理对一个巨大的 10 列表进行排序的最佳方法?
- c# - 如何使用 ToShortDateString 拼出月份?
- python - ValueError:检查目标时出错:预期dense_3的形状为(1,)但得到的数组形状为(2,)keras
- html - 如何使png文件成为html中的按钮
- ios - 为什么 Progress.fractionCompleted 超过 1.0?
- php - CakePHP 在 Null 上调用成员函数 query()