好吧,首先情况并不像标题中那么容易。所以我想创建一个表单,它可以基于 Cycle 模型创建对象,并仅更新 Post 模型中的一个字段(有问题的字段是“cycle_title”)。更重要的是,它不仅是一个帖子需要更新,而且还有多个帖子(所有帖子的标题都保存在 Cycle.post 中)。
浏览次数
class CycleCreateView(LoginRequiredMixin, BSModalCreateView):
template_name = 'blog/cycle_form.html'
form_class = CycleForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update(user=self.request.user)
return kwargs
def form_valid(self, form, **kwargs):
form.instance.author = self.request.user
return super().form_valid(form)
def get_success_url(self):
reverse_user = self.request.user
return reverse('profile', kwargs={'username': reverse_user})
表格
class CycleForm(BSModalForm):
def __init__(self, *args, user=None, **kwargs):
super().__init__(*args, **kwargs)
if user is not None:
self.fields['posts'].queryset = Post.objects.filter(author=user)
class Meta:
model = Cycle
fields = ['title', 'description', 'posts']
widgets = {
'posts': forms.CheckboxSelectMultiple(),
}
型号
class Post(models.Model):
title = models.CharField(max_length=100, unique=True)
content = MDTextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
cycle_title = models.CharField(max_length=100, default='')
class Cycle(models.Model):
title = models.CharField(max_length=100, unique=True)
description = models.TextField(max_length=500, default="Brak opisu")
date_created = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
posts = models.ManyToManyField(Post)
我正在考虑这样的解决方案:
for i in form.cleaned_data['posts']:
post = Post.objects.get(title=form.cleaned_data['title'][i])
post.cycle_title = form.cleaned_data['title']
post.save()
但我怀疑这是否是解决这个问题的好方法
最佳答案
我们专门构建了一个包django-shapeshifter
来处理这种情况。您可以在这里找到它:
https://github.com/kennethlove/django-shapeshifter
基本前提是创建两个模型表单,然后将它们包含在同一个模板中。给出的示例展示了如何从同一 View 和表单更新User
和Profile
模型。听起来这很适合您的问题。完全公开,我是这个包的贡献者,但它的创建正是因为像您这样的挫败感!
关于django - 如何在 django 中以一种形式更新两个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57836494/