【问题标题】:Adding public attribute in Django model在 Django 模型中添加公共属性
【发布时间】:2017-05-20 18:09:09
【问题描述】:

为用户提供公开主题的选项。这个会 需要一个名为 public 的属性作为主题模型的一部分(默认情况下应设置为 False)和 new_topic 页面上的表单元素,允许用户将主题从私有更改为公共[在此处输入链接描述][1]

from django.db import models
from django.contrib.auth.models import User

class Topic(models.Model):
    """A topic the user is learning about."""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User)

    def __str__(self):
        """Return a string representation of the model."""
        return self.text

class Entry(models.Model):
    """Something specific learned about a topic."""
    topic = models.ForeignKey(Topic)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'entries'

    def __str__(self):
        """Return a string representation of the model."""
        return self.text[:50] + "..."enter code here

【问题讨论】:

  • 有什么问题?
  • 在Topic模型中添加一个名为public的属性,需要默认设置为False!
  • public = models.BooleanField(default=False)
  • 您好 Doner,我认为您的方法在 public 属性更改中是正确的。谢谢,但这个问题还没有完全解决。这个问题的第二部分是 new_topic 页面上的表单元素,它允许用户将主题从私有更改为公共,我不确定如何在 new_topic html 文件中进行更改。

标签: python django models


【解决方案1】:

您可以简单地将其作为字段添加到您的 Topic 模型中:

public = models.BooleanField(default=False)

然后将其添加到您的TopicForm 的字段列表中,它将自动呈现在表单上:

fields = ['text', 'public']

【讨论】:

    【解决方案2】:

    我也被困在这一点上。我有模板上表单元素的解决方案。我已经像复选框一样实现了它:

    new_topic.html

    <label><input type="checkbox" name="public"/> Public</label>
    

    我通过添加元属性public编辑了forms.py:

    forms.py

    class TopicForm(forms.ModelForm):
        class Meta:
            model = Topic
            fields = ['text']
            labels = {'text': ''}
            public = forms.BooleanField(required=False)
    

    在 new_topic 函数下的 views.py 中,我添加了检查复选框:

    @login_required
    def new_topic(request):
        """Add a new topic."""
        if request.method != 'POST':
            # No data submitted; create a blank form.
            form = TopicForm()
        else:
            # POST data submitted; process data.
            form = TopicForm(request.POST)
            if form.is_valid():
                new_topic = form.save(commit=False)
                new_topic.owner = request.user
                if request.POST["public"]:
                    new_topic.public = True
                new_topic.save()
                return HttpResponseRedirect(reverse('learning_logs:topics'))
    
        context = {'form': form}
        return render(request, 'learning_logs/new_topic.html', context)
    

    单击复选框时,属性 public 正确更改为 true,但我无法覆盖该主题的 @login_required。准确地说,新创建的主题是不公开的。所以如果有人在这一点上有解决方案那就太好了

    【讨论】:

    • 这确实比它需要的复杂得多。请看我的回答。
    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2018-06-27
    • 2016-11-26
    • 2015-08-28
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多