Создание раздела категории с помощью django

Я пытаюсь добавить раздел категории в форму записи блога, используя django, поле категории создано и я не получил никакой ошибки, но выпадающий список не создан.

models.py

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


class Category(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('posts')


class Post(models.Model):
    STATUS = [
        (0, 'Drafted'),
        (1, 'Published'),
    ]
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    published_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    status = models.IntegerField(choices=STATUS, default=0)
    category = models.CharField(max_length=200, default='uncategorized')

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('my_blog:posts')

forms.py

from django import forms
from .models import Post


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title', 'author', 'category', 'content')

        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'author': forms.Select(attrs={'class': 'form-control'}),
            'category': forms.Select(attrs={'class': 'form-control'}),
            'content': forms.Textarea(attrs={'class': 'form-control'}),
        }

admin.py

from django.contrib import admin
from .models import Post, Category, Comment


admin.site.register(Post)
admin.site.register(Category)

Этот метод был основан на учебнике, и я задаюсь вопросом, правильный ли это способ создания полей категорий. Помогите, пожалуйста?

Вы должны использовать модель Category как ForeignKey в модели Post:

class Post(models.Model):
    ...
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True)
    ...

Если у вас есть некатегоризированные посты, вы можете установить для них значение null. В противном случае вам следует использовать models.CASCADE или models.PROTECT вместо models.SET_NULL в on_delete.

class Post(models.Model):
   ...
   category = models.ForeignKey(Category, on_delete=models.CASCADE)
   ...

После внесения изменений в модель не следует забывать о следующих командах:

python manage.py makemigrations

python manage.py migrate

вам следует дать unique=True имя Category и в модели Post для категории использовать ForeignKey вместо CharField. По умолчанию ForeignKey будет полем select, поэтому вам не нужно делать ничего другого.

Нравится :

class Category(models.Model):
    name = models.CharField(max_length=200, unique=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('posts')


class Post(models.Model):
    STATUS = [
        (0, 'Drafted'),
        (1, 'Published'),
    ]
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    published_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    status = models.IntegerField(choices=STATUS, default=0)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts')

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('my_blog:posts')
Вернуться на верх