Задать вопрос
@nikidreiks

Почему не отображается форма отправки поста?

Есть 3 приложения: "publication", "project" - основное, "usercreatepost", ещё users с авторизацией, но там всё ок.

приложение publication:

views.py:

from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse, HttpResponseNotFound, Http404
from publication.models import Userpublication
from django.urls import reverse
from publication.forms import PostEditForm
from usercreatepost.forms import PostForm
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.views import LoginView
from django.contrib.auth.decorators import login_required
from django.contrib import messages


def indexs(request):
    posted = Userpublication.published.filter(is_published=1)
    return render(request, 'publication/post.html', {'post_lists': posted})


def show_post(request, post_slug,  *args, **kwargs):
    post = get_object_or_404(Userpublication, slug=post_slug)

    data = {
    'user': post.user,
    'content': post.content,
    'post': post,
    }

    return render(request, 'publication/post_user.html', data)


@login_required
def edit_post(request, post_slug):
    post = get_object_or_404(Userpublication, slug=post_slug)
    # Проверка, является ли текущий пользователь автором поста
    if request.user != post.author:
     # Если текущий пользователь не является автором поста, выполните необходимые действия,
     # например, перенаправьте его на другую страницу или отобразите сообщение об ошибке
        messages.error(request, 'Вы не можете редактировать этот пост')
        return redirect('feeds', post_slug=post.slug)
    if request.method == 'POST':
        form = PostEditForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            messages.success(request, 'Пост успешно отредактирован!') # Установка флеш-сообщения
            return redirect('feeds', post_slug=post.slug)  # Перенаправляем на страницу просмотра поста
    else:
        form = PostEditForm(instance=post)
    return render(request, 'publication/edit_post.html', {'form': form})


def get_edit_url(self):
    return reverse('edit_post', kwargs={'post_slug': self.slug})



def post_detail(request, post_slug):
    post = get_object_or_404(Userpublication, slug=post_slug)
    return render(request, 'publication/post_user.html', {'post': post})


urls.py:

from django.urls import path
from . import views
from .views import edit_post
from usercreatepost.views import create_post
urlpatterns = [
    path('create/', create_post, name='create_posts'),
    path('<slug:post_slug>/', edit_post, name='feeds'),
    path('posts/<slug:post_slug>/', views.show_post, name='poserts'),
    path('post/<slug:post_slug>/', views.post_detail, name='post_detail'),
    path('edit/<slug:post_slug>/', edit_post, name='edit_post'),
    
]


models.py:

from django.db import models
from autoslug import AutoSlugField  # Импортируем AutoSlugField из библиотеки django-autoslug
from django.urls import reverse
from django.contrib.auth.models import User

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_published=1).order_by('-time_create')

class Userpublication(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    slug = AutoSlugField(max_length=255, unique=True, populate_from='content')  # Используем AutoSlugField для автоматической генерации slug
    content = models.TextField('', blank=True)
    time_create = models.DateTimeField('Время создания', auto_now_add=True)
    time_update = models.DateTimeField('Время обновления', auto_now=True)
    is_published = models.BooleanField('Опубликовано ли', default=True)

    objects = models.Manager()
    published = PublishedManager()

    def __str__(self):
        return self.slug

    class Meta:
        ordering = ['-time_create']
        indexes = [
            models.Index(fields=['-time_create'])
        ]

    class Meta:
        verbose_name = 'Публикация'
        verbose_name_plural = 'Публикации'

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={'post_slug': self.slug})

    def get_edit_url(self):
        return reverse('edit_post', kwargs={'post_slug': self.slug})


forms.py:

from django import forms
from .models import Userpublication

class PostEditForm(forms.ModelForm):
    class Meta:
        model = Userpublication
        fields = ['content']


приложение project:

views.py:

from django.shortcuts import render
from django.views.generic.base import View
from django.contrib.auth.decorators import login_required
from publication.models import Userpublication




@login_required     
def indexs(request):



        posted = Userpublication.published.all()

        return render(request, 'twippie/home.html', {'post_lists': posted})


urls.py:

from django.urls import path
from . import views
from usercreatepost.views import create_post

urlpatterns = [
        path('feed/', views.indexs, name='home'),
        

]


template: home и layout.

приложение usercreatepost:
views.py:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from .forms import PostForm
from publication.models import Userpublication

def create_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            messages.success(request, 'Пост успешно создан!')
            return redirect('home')
    else:
        form = PostForm()
    return render(request, 'usercreatepost/create_post.html', {'form': form})


urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.create_post, name='create_post'),
]


forms.py:

from django import forms
from publication.models import Userpublication

class PostForm(forms.ModelForm):

    class Meta:
        model = Userpublication
        fields = ['content']


и templates creat_post.html

При создании поста по url 'create/' форма отображается и пост добавляется. А когда я её добавляю в шаблон home основного приложения project форма прекращает отображаться, отображается только кнопка "создать пост".

пробовал и так:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Создать пост</button>
</form>


и так:

<form action="{% url 'create_post' %}" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Создать пост</button>
</form>


Что я не доглядел?
  • Вопрос задан
  • 64 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@nikidreiks Автор вопроса
В общем дошло до меня, что можно всё в одну функцию написать, а не раздельно;

Теперь она выглядит вот так:

def create_post(request):
    if request.method == 'POST':
        # Если получен POST-запрос, обработаем форму создания поста
        form = PostForm(request.POST)
        if form.is_valid():
            # Если форма валидна, сохраняем новый пост в базе данных
            form.save()
            # Перенаправляем пользователя на главную страницу
            return redirect('home')
    else:
        # Если запрос GET, создаем экземпляр формы без данных из запроса
        form = PostForm()
    
    # Получаем список опубликованных постов
    post_lists = Userpublication.objects.all().order_by('-time_create')

    # Передаем форму и список постов в контекст шаблона
    context = {
        'form': form,
        'post_lists': post_lists,
    }

    return render(request, 'project/home.html', context)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы