django Параметр URL-адреса представления на основе класса при создании сообщения в текущей категории - PullRequest
0 голосов
/ 05 марта 2020

Допустим, у меня есть три категории (учебные пособия, новости, вакансии).

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

и уверен, что сообщение имеет ту же модель и поля для всех категорий.

моя проблема:

, если пользователь был в шаблоне списка категорий (скажем, учебник) .. я хотите, чтобы пользователь при создании нового сообщения .. он был сохранен непосредственно в категории учебника ... и если пользователь был в шаблоне списка (скажем, новости) .. он создаст новое сообщение, которое будет сохранено непосредственно в категории новостей.

Я имею в виду создание нового сообщения, сохраненного непосредственно в текущей категории.

Я верю, что буду использовать (передать параметр url в представления на основе классов), но на самом деле мне не удалось это сделать .. и я искал тоннаж вопросов без получил то, что я хочу.

может помочь любой орган .. с образцом, пожалуйста.

models.py

class Category(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50, unique=True)

    def save(self, *args, **kwargs):
        if not self.slug and self.name:
            self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

просмотров. py

def PostListView(request, category_slug=None):
    category = None
    posts = Post.objects.all().prefetch_related().annotate(commentscountperpost=Count('comments'))
    categories = Category.objects.prefetch_related().annotate(total_product_category=Count('post'))
    if category_slug:
        category = Category.objects.get(slug=category_slug)
        posts = posts.filter(category=category)
    context = {
        'title': 'Home Page',
        'posts': posts,
        'total_posts': total_posts,
        'categories': categories,
        'category': category,}
    return render(request, 'blog/index.html', context)

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    template_name = 'blog/new_post.html'
    form_class = PostCreateForm

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

forms.py

class PostCreateForm(forms.ModelForm):
    title = forms.CharField(label='Title')
    content = forms.CharField(label='Content', widget=forms.Textarea)

    class Meta:
        model = Post
        fields = ['title', 'content']

urls.py

path('index_list/', PostListView, name='list'),
path('<slug:category_slug>', PostListView, name='post_category_list'),
path('new_post/', PostCreateView.as_view(), name='new_post'),

new_post. html шаблон

{% extends 'base.html' %}
{% block content %}
{% load crispy_forms_tags %}

<div class="border p-4 mb-5">
    <legend class="border-bottom pb-1 mb-3">New Post </legend>
    <form method="POST">
        {% csrf_token %}
        {{form|crispy}}
        <input class="btn btn-secondary mt-4" type="submit" value="Add New Post">
    </form>
</div>
{% endblock content %}

список. html шаблон

{% for category in categories %}
<h5><a class="text-primary" href="{% url 'post_category_list' category.slug %}">
    {{ category.name }} ({{ category.total_product_category }})</a></h5>
{% endfor %}
    <h5>{{ total_posts }} Total Posts </h5>
{% if category %}
    <a href="{% url 'new_post' %}">New {{ category }}</a>
{% endif %}

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы можете попробовать так:

 class PostCreateView(generic.CreateView):
       model = Post
       template_name = 'blog/new_post.html'
       form_class = CreatePostForm
       slug_url_kwarg = 'slug'

       def form_valid(self, form):
          category = Category.objects.get(slug=self.kwargs['slug'])
          form.instance.category = category
          form.instance.author = self.request.user
          return super(PostCreateView, self).form_valid(form)

И в URL

path('new_post/<slug>/', PostCreateView.as_view(), name='new_post'),
0 голосов
/ 05 марта 2020

да, я нашел его, в зависимости от ответа arjun, большое спасибо за arjun

в списке сообщений за изменение шаблона категории:

<a href="{% url 'new_post' %}">New {{ category }}</a>

на:

<a href="{% url 'new_post' category.slug %}">New {{ category }}</a>

и работает нормально, спасибо.

...