django - 如何在 django 中以一种形式更新两个模型?

标签 django django-forms

好吧,首先情况并不像标题中那么容易。所以我想创建一个表单,它可以基于 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 和表单更新UserProfile 模型。听起来这很适合您的问题。完全公开,我是这个包的贡献者,但它的创建正是因为像您这样的挫败感!

关于django - 如何在 django 中以一种形式更新两个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57836494/

相关文章:

javascript - 带有 css/js 的 Django 'Include' 模板

Python - 文件或文件夹内容版本控制

Django - 对称关系 OneToOneField

python - Django REST Framework 验证 slug 字段

python - Django表单字段自定义属性分配和在模板中使用

python - 在Django中创建对象时将当前登录的用户设置为模型中的用户

python - django AbstractUser模型 'str'对象没有属性 '_meta'

python - Django - 脆皮表格可以分成两列吗?

jquery - 什么是 attr 'gtbfieldid' 以及如何避免自动完成行为?

django - 如何向 Django 表单小部件添加额外的上下文