【问题标题】:Django updating a model with a many-to-many fieldDjango 使用多对多字段更新模型
【发布时间】:2017-05-30 17:25:50
【问题描述】:

我正在尝试为我的网站制作帖子编辑器。当我触发发布模型时,我收到错误“无法更新模型字段(仅允许非关系和外键)”。更新时。如何更新此模型?

models.py

class Post(models.Model):
    title = models.CharField(max_length=256)
    disclaimer = models.CharField(max_length=256, blank=True)
    BLOGS = 'blogs'
    APPLICATIONS = 'applications'
    GAMES = 'games'
    WEBSITES = 'websites'
    GALLERY = 'gallery'
    PRIMARY_CHOICES = (
        (BLOGS, 'Blogs'),
        (APPLICATIONS, 'Applications'),
        (GAMES, 'Games'),
        (WEBSITES, 'Websites'),
    )
    content_type = models.CharField(max_length=256, choices=PRIMARY_CHOICES, default=BLOGS)
    screenshot = models.CharField(max_length=256, blank=True)
    tags = TaggableManager()
    body = RichTextField()
    date_posted = models.DateTimeField(default=datetime.now)
    date_edited = models.DateTimeField(blank=True, null=True)
    visible = models.BooleanField(default=True)
    nsfw = models.BooleanField()
    allow_comments = models.BooleanField(default=True)
    files = models.ManyToManyField(File, blank=True)

    def __str__(self):
        if (self.visible == False):
            return '(Hidden) ' + self.title + ' in ' + self.content_type
        return self.title + ' in ' + self.content_type

views.py

class EditPostView(UpdateView):
    form_class = PostForm
    model = Post
    template_name = 'personal/editpost.html'

    def get(self, request, pk):

        if (not request.user.is_superuser):
            return HttpResponseForbidden()

        post = Post.objects.get(id=pk)
        if (post is None):
            return HttpResponseNotFound()

        form = self.form_class(instance=post)

        return render(request, self.template_name, {'form': form, 'post': post})

    def post(self, request, pk):

        if (not request.user.is_superuser):
            return HttpResponseForbidden()

        post = Post.objects.get(id=pk)
        if (post is None):
            return HttpResponseNotFound()

        form = self.form_class(request.POST, instance=post)

        if (form.is_valid()):
            title = form.cleaned_data['title']
            content_type = form.cleaned_data['content_type']
            screenshot = form.cleaned_data['screenshot']
            tags = form.cleaned_data['tags']
            body = form.cleaned_data['body']
            nsfw = form.cleaned_data['nsfw']
            allow_comments = form.cleaned_data['allow_comments']
            files = form.cleaned_data['files'] 

            date_edited = datetime.now()

            Post.objects.filter(id=pk).update(title=title, content_type=content_type,
                                              screenshot=screenshot, tags=tags, 
                                              body=body, nsfw=nsfw, 
                                              allow_comments=allow_comments,
                                              files=files,
                                              date_edited=date_edited)

            return redirect('/posts/' + str(post.id))
        else:
            return HttpResponseNotFound()

        return HttpResponseNotFound()

【问题讨论】:

标签: python django django-models


【解决方案1】:

我会改变:

Post.objects.filter(id=pk).update(title=title, content_type=content_type, screenshot=screenshot, tags=tags, body=body, nsfw=nsfw, allow_comments=allow_comments, files=files, date_edited=date_edited)

到:

post = Post.objects.get(pk=pk)
post.title=title
post.content_type=content_type
post.screenshot=screenshot
post.tags=tags
post.body=body
post.nsfw=nsfw
post.allow_comments=allow_comments
post.files=files
post.date_edited=date_edited
post.save()

看起来文件是一个多对多的字段?然后您需要创建该字符串的对象并添加它。示例代码:

file = File()
file.name = ""
file.save()    

post = Post.objects.get(pk=pk)
post.title=title
post.content_type=content_type
post.screenshot=screenshot
post.tags=tags
post.body=body
post.nsfw=nsfw
post.allow_comments=allow_comments
post.files.add(file)
post.date_edited=date_edited
post.save()

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 2010-10-30
    • 2012-12-01
    • 2021-11-27
    • 1970-01-01
    • 2013-05-17
    • 2020-08-13
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多