【问题标题】:Saving category_id for new post in django在 django 中为新帖子保存 category_id
【发布时间】:2018-09-11 06:45:20
【问题描述】:

我在为博客保存/创建新帖子时遇到问题。
我已经有帖子模型,每个帖子都有自己的类别。所以我也有类别模型。在 CreateView 模板中,我已经从数据库中获取了所有类别并显示在选择/选项标签中。问题是我想在创建新帖子时保存 category_id。但我不知道怎么做?如何判断表单 POSTED 是否获取 category_id 并将其保存为具有 category_id 字段的 Post 模型?

查看:

class PostCreateForm(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'short_text', 'long_text', 'post_pic']

    def get_context_data(self, **kwargs):
        context = super(PostCreateForm, self).get_context_data(**kwargs)
        context['categories'] = Category.objects.all().order_by('id')
        return context


    def form_valid(self, form, **kwargs):
        form.instance.author = self.request.user
        return super().form_valid(form)

型号:

class Category(models.Model):
    title = models.CharField(max_length=255)

    def __str__(self):
        return self.title


class Post(models.Model):
    title               = models.CharField(max_length=255)
    short_text          = models.TextField()
    long_text           = models.TextField()
    post_pic            = models.ImageField(default="post_pic.jpg", 
    blank=False, upload_to='post_pics')
    date_published      = models.DateTimeField(default=timezone.now())
    date_upadated       = models.DateTimeField(auto_now=True)
    author              = models.ForeignKey(User, on_delete=models.CASCADE)
    category            = models.ForeignKey(Category, default=None, 
    on_delete=models.CASCADE)

def __str__(self):
    return self.title

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

post_form.html

{% extends 'blog/base.html' %}
{% load crispy_forms_tags %}

{% block title_head %}
    New Post
{% endblock title_head %}
{% block content %}
     <form method="post" enctype="multipart/form-data">

        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4 pb-2">New Post</legend>
               {{ form|crispy }}
        <select class="form-control" name="category">
            {% for category in categories %}
                <option value="{{ category.id }}">{{ category }}</option>
            {% endfor %}
        </select>
        </fieldset>

        <div class="form-group">
            <button type="submit" class="btn btn-outline-info">Post</button>
        </div>

     </form>
{% endblock content %}

【问题讨论】:

  • 由于某种原因,您已将类别字段从表单的字段列表中排除。你为什么这样做?为什么还要单独输出category select?
  • 已解决,谢谢。我不知道可以从字段列表中访问类别字段。我尝试从数据库中获取所有类别并将它们显示在选择/选项标签中,然后将选项的值设置为等于 category_id 并在提交表单后获取类别 ID,然后保存在类别字段中以供发布。

标签: python django


【解决方案1】:

有几种方法可以实现这一点。这是最简单的:

如果您希望类别保持不变,那么您可以对它们进行硬编码,并在您的 Post 模型上使用带有 choices= 关键字的 CharField

class Post(models.Model):
    CATEGORY_CHOICES = (
        ('Horror', 'Horror'),
        ('Romance', 'Romance'),
        ('Comedy', 'Comedy'),
    )
    category = models.CharField(choices=CATEGORY_CHOICES)

那么您需要做的就是将'category' 添加到 CreateView 中的字段列表中。


旁注你应该重命名你的CreateView 这是一个视图而不是一个表单。这可能会引起混淆。

【讨论】:

  • 不,实际上我想从数据库中选择类别,我做到了。关于 CreateView 我认为这是真的,在数据​​库中保存新帖子没有问题,除非我提交表单时出现此错误 NOT NULL constraint failed: blog_post.category_id
【解决方案2】:

解决了!

我们在字段列表中有访问类别,因此获取所有类别然后将它们显示在 html 页面的选择选项标签中是没有用的。只需在字段列表中添加类别字段

更改 PostCreateForm

从这里改变它

class PostCreateForm(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'short_text', 'long_text', 'post_pic']

    def get_context_data(self, **kwargs):
        context = super(PostCreateForm, self).get_context_data(**kwargs)
        context['categories'] = Category.objects.all().order_by('id')
        return context


    def form_valid(self, form, **kwargs):
        form.instance.author = self.request.user
        return super().form_valid(form)

到这个

class PostCreateForm(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'short_text', 'long_text', 'post_pic', 'category']

    def get_context_data(self, **kwargs):
        context = super(PostCreateForm, self).get_context_data(**kwargs)
        return context


    def form_valid(self, form, **kwargs):
        form.instance.author = self.request.user
        return super().form_valid(form)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2022-11-15
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多