Создание раздела категории с помощью 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')