【问题标题】:How can I automatically change the value of a Boolean field?如何自动更改布尔字段的值?
【发布时间】:2017-02-22 15:12:12
【问题描述】:

这个特殊的布尔字段确定帖子是否为草稿。默认设置为 True。

当用户编辑草稿时,我希望该值自动更改为 False,以便它与所有其他帖子一起列出(而不是在草稿列表中)。

提交按钮能否同时提交帖子并更改布尔值?理想情况下,我想,一旦输入草稿表格,该字段就会更改。

以下是相关代码: 草稿编辑模板

{{ title }}</B></h3></div>
<div class="row">
    <div class="col-sm-12-md-7 col-sm-offset-0 col-sm-8">
        <div class="panel panel default">
            <div class="panel-body">
                <p class="well col-sm-offset-3 col-sm-12">{{ summary }}</p>

                <form class="form-horizontal" method="post" action="" enctype="multipart/form-data">
                    {% csrf_token %}
                    {% include 'posts/form-template.html' %}
                    <div class="form-group col-sm-offset-3 col-sm-6">

                        <div class="col-sm-offset-9 col-sm-10">
                            <button type="submit" class="btn btn-primary">Send</button>
                        </div>

                    </div>

                </form>
            </div>
        </div>
    </div>
</div>

这是我的草稿编辑表单

class UpdateForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = [
            "title", "content", "categories", "tags",
        ]

这是 Post 模型

class Post(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
        title = models.CharField(max_length=100)
        content = HTMLField()
        draft = models.BooleanField(default=True)
        updated = models.DateTimeField(auto_now=True, auto_now_add=False)
        upvote = VotableManager()
        timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
        categories = models.ManyToManyField(
            'category.Category',
            help_text='Categorize this item.'
        )
        tags = models.ManyToManyField(
            'category.Tag',
            help_text='Tag this item.'
        )

        suggest = models.ForeignKey('Suggest', blank=True, null=True, default=0)


        def get_absolute_url(self):
            return reverse('posts:detail', kwargs={'pk': self.pk})

        def __str__(self):
            return self.title

这是编辑草稿的视图

def post_update(request, id=None):
    instance = get_object_or_404(Post, id=id)
    model = Post
    form = UpdateForm(request.POST or None, instance=instance)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()

    context = {
        "title": instance.title,
        "instance": instance,
        "form": form,
        "summary": instance.summary,
    }
    return render(request, "posts/suggest_form_update.html", context)

【问题讨论】:

  • "**这里是编辑草稿的视图**"你的视图在哪里??
  • @PrakharTrivedi 谢谢。现已添加。
  • 是什么阻止了您自己在视图中执行此操作?你有实例,为什么不能设置draft=False?
  • @TomHiggins 丹尼尔是对的。您应该在您的 views.py 文件中执行此操作。这是推荐的方式。
  • @DanielRoseman,Prakhar 我觉得自己像个白痴!这行得通。谢谢!

标签: django forms post boolean


【解决方案1】:

您可以通过两种方式完成此操作:

  1. 在您的视图中(在 if form.is_valid(): 条件内,在对象被保存之前。
  2. 通过自定义save() 方法在您的表单中。

    def save(self, *args, **kwargs):
        self.instance.draft = True
        return super(UpdateForm, self).save(*args, **kwargs)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 2016-12-19
    • 2014-12-17
    • 2020-11-08
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多