为django中的新帖子保存category_id

问题描述 投票:0回答:2

保存/创建博客新帖子时遇到问题。 我已经有Post模型,每个帖子都有自己的类别。所以我也有分类模型。在CreateView模板中,我已经从DB获得了所有类别并显示在select / option标签中。问题是我想在创建新帖子时保存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 %}
python django
2个回答
0
投票

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

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

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

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


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


0
投票

解决了!

我们在字段列表中有访问类别,因此获取所有类别然后在html页面的select-option标记中显示它们是没用的。只需在字段列表中添加类别字段即可

更改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)
© www.soinside.com 2019 - 2024. All rights reserved.