我在 Django 中有一个带有 ManyToManyField 的表。无法弄清楚如何更新表条目

陡峭 27

我有一个可以有多个类别的帖子的表格,以及一个可以有多个帖子的类别的表格。模型.py:

class Category(models.Model):
   name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

class Post(models.Model):
    title = models.CharField(max_length=25)
    body = models.TextField()
    image = models.ImageField(blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    categories = models.ManyToManyField('Category', related_name='posts', blank=True)
    profile = models.ForeignKey('Profile', verbose_name='User',
                                on_delete=models.CASCADE,
                                related_name='profile')

    def __str__(self):
        return self.title

视图.py

Сlass ListCategoryView(generic.ListView):

    def get(self, request, *args, **kwargs):
        category = kwargs['category']
        posts = Post.objects.filter(categories__name__contains=category).order_by('-created_on')
        context = {
            "category": category,
            "posts": posts
        }
        return render(request, "list_category.html", context)

class ListPostView(generic.ListView):

    model = Post
    context_object_name = 'posts'
    template_name = 'list_post.html'

    def get_queryset(self):
        queryset = super().get_queryset()
        queryset = queryset.order_by('-created_on')
        return queryset

class CreatePostView(LoginRequiredMixin, generic.CreateView):

    model = Post
    template_name = 'create_post.html'
    form_class = PostDocumentForm

    def post(self, request, *args, **kwargs):
        blog_form = PostDocumentForm(request.POST, request.FILES)
        if blog_form.is_valid():
            categories = Category.objects.create(name=blog_form.cleaned_data['categories'])
            title = blog_form.cleaned_data.get('title')
            body = blog_form.cleaned_data.get('body')
            profile = request.user.profile
            image = self.get_image(blog_form)
            instance = Post.objects.create(title=title, body=body, profile=profile, image=image)
            instance.categories.set([categories])
            return HttpResponseRedirect('/blog/')
        return render(request, 'create_post.html', context={'form': blog_form})

    def get_image(self, form):
        image = form.cleaned_data.get('image')
        return image


class EditPostView(generic.UpdateView):

    form_class = PostDocumentForm
    model = Post
    template_name = 'edit_post.html'
    success_url = '/blog/'

表格.py:

class CategoryDocumentForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = ('name',)


class PostDocumentForm(forms.ModelForm):
    categories = forms.CharField(min_length=3, max_length=100, required=False)

    class Meta:
        model = Post
        fields = ('title', 'body', 'image', 'categories')

我不知道如何更新帖子以便更新类别。我寻找了很多解决方案,但没有一个有帮助。我尝试了 get_or_create、update、delete,然后再次创建,但没有任何效果。更好,就像在大多数社交网络中一样 - 手动添加标签(这里是一个类别),而无需从可能的列表中进行选择

伊夫·哈里

这可能会帮助您:

class PostEditView(UpdateView):
     def form_valid(self, form):
        # Take care of creating of updating your post with cleaned data
        # by yourself

        category_tokens = form.cleaned_data['categories'].split()
        categories = set()
        for token in category_tokens:
            try:
                category = Category.objects.get(name=token)
            except ObjectDoesNotExist:
                category = Category.objects.create(name=token)
            
            categories.add(category)

        # now you need to add the categories which are new to this post
        # and delete the categories which do not belong anymore to your post
        current_posts_categories = set(post_instance.categories_set.all())
        categories_to_add = categories - current_posts_categories
        categories_to_delete = current_posts_categories - categories

        # further handling is up to you ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何在杜松子酒的URL中有一个带有斜杠的参数

我如何在Django的一个序列化器中有两个模型

我有一个错误,但我没有弄清楚是什么原因引起的

我如何在Django Rest Framework中通过穿透模型制作可写的ManyToManyField?

无法弄清楚我的条件有什么问题

具有ManyToManyField的Django CreateView

我无法弄清楚Python上的类结构,并且有一个“ AttributeError”

我的程序中有一个错误,我无法弄清楚

无法弄清楚我的for循环中有什么语法错误

使用Django / South将ManyToManyField添加到现有模型中给我一个错误

无法弄清楚为什么我的“选择下拉列表”仅更新一次

我有一个数据表,其中有一个带有十进制值的列

Bootstrap联系表中的PHP无法正常工作,有人可以弄清楚我做错了什么吗?

无法弄清楚为什么我的css表没有显示。我已经搜寻过这个网站和Google

我无法弄清楚如何计算每个客户在MySQL第一年的价值

我在sql中有3个表如何从最后一个表中获取数据

我在一个函数中有一个函数,如何同时退出它们呢?

我正在创建一个 FPS 游戏,但我无法弄清楚如何循环我已附加脚本的敌人的射击动画,直到我的玩家死亡

Django .. 我需要有一个 DateField 应该在 auth_user 表更新时更新

它就像一个斐波那契,我无法弄清楚这个代码

带有硒的机器人,我无法弄清楚这个错误

带有 manytomanyfield 的 Django 过滤器

Django - 在连接表中获取变量 - ManyToManyField

无法弄清楚当我去并发时如何将结果写回同一个工作表。futures

我如何在 Swift 中有一个变量和一个同名的函数

我正在尝试将 Twilio 广播短信功能添加到我的 Django 应用程序中,但无法弄清楚如何检索所有数据库电话号码

我无法弄清楚这个单一的脚本问题

django ManyToManyField 唯一

在 django 中删除一个带有 id 的表