Models.py порядок моделей дает NameError: имя 'Category/Post' не определено

Я новичок в Django, поэтому это, вероятно, глупый вопрос, но,

Когда я помещаю модель класса Category над моделью класса Post, я получаю ошибку

NameError: name 'Post' is not defined error.

но когда я пытаюсь поместить модель класса Category под модель Post (как в коде здесь), я получаю

categories = models.ManyToManyField(Category)
NameError: name 'Category' is not defined error.

models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)  #if is deleted than delete their posts 
    location = models.CharField(max_length=100, default="")
    tags = TaggableManager()
    likes = models.ManyToManyField(User, related_name='blog_posts')
    categories = models.ManyToManyField(Category)


    def total_likes(self):
        return self.likes.count()


    def __str__(self):
        return self.title


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



class Category(models.Model):
    post = models.ForeignKey(Post, related_name="categories") 
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

admin.py

from django.contrib import admin
from .models import Post, Comment, Category #, Konum
# Register your models here.


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

#admin.site.register(Konum)

Вы можете использовать строковый литерал для указания имени модели, которую еще нужно определить, поэтому вы можете использовать ManyToManyField('Category') или ForeignKey('Post', on_delete=models.CASCADE), например, для ссылки на еще не определенные модели:

from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    location = models.CharField(max_length=100, default="")
    tags = TaggableManager()
    likes = models.ManyToManyField(settings.AUTH_USER_MODELS, related_name='liked_posts')
    categories = models.ManyToManyField('Category')

Однако не кажется логичным, что Category имеет ForeignKey ссылку на пост: это означало бы, что Category ссылается на ровно одну Post запись?

Например, вы можете использовать ListView с:

class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 199

    def get_queryset(self):
        qs = super().get_queryset()
        if self.request.GET.get('category'):
            return qs.filter(categories__name=self.request.GET['category'])
        return qs

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

Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка на User модель раздел документации .

часть кода


<form method="GET" action=".">

        <div class="form-group col-md-4">
                <label for="category">Category</label>
                <select id="category" class="form-control" name="category">
                  <option selected>Choose...</option>
                  {% for cat in categories %}
                  <option value="{{ cat }}">{{ cat }}</option>
                  {% endfor %}
                </select>
        </div>
        <button type="submit" class="btn btn-primary">Search</button>

    </form>

views.py

urls.py


from django.urls import path, re_path
from .import views
from .views import PostListView, PostDetailView, PostCreateView, PostUpdateView, PostDeleteView, UserPostListView, TagIndexView, LikeView  #, LocationPostListView

urlpatterns = [
    path('', PostListView.as_view(), name="blog-home"), #has a empty strting bc its already proccessed blog part in main urls
    path('user/<str:username>', UserPostListView.as_view(), name="user-posts"),
    #--------------------------------------------------------------------------------------------------------------------------------------
    #path('location/<str:loc>', LocationPostListView.as_view(), name="location-posts"),
   #--------------------------------------------------------------------------------------------------------------------------------------

    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),#pk means primary key like post 1 post 2 etc
    path('post/new/', PostCreateView.as_view(), name='post-create'),
    path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
    path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
    path('about/', views.about, name="blog-about"),
#--------------------------------------------------------------------------------------------------------------------------------------
    path('tag/<slug:slug>/', TagIndexView.as_view(), name='tagged'),
    path('like/<int:pk>', LikeView, name='like_post'),
#--------------------------------------------------------------------------------------------------------------------------------------
]
Вернуться на верх