Как исправить ошибку «Пост с этим пользователем уже существует» на Django при попытке добавить новый пост? - PullRequest
0 голосов
/ 27 мая 2019

У меня есть представление create_post, через которое я пытаюсь добавить новое сообщение в блог, над которым я работаю.Однако, когда я нажимаю «Отправить» после заполнения формы, которая включает в себя пользователя (выпадающее меню всех зарегистрированных пользователей), заголовок и текст, я получаю сообщение с этим пользователем уже существует.Как видно ниже, post.user имеет внешний ключ User.Не означает, что в одном сообщении может быть только один пользователь (автор), а у пользователя может быть много сообщений.Почему мне не разрешено добавлять еще одно сообщение того же пользователя?

Кроме того, как я могу использовать встроенные компоненты Django для отображения сообщения, такого как «Публиковать как {{user.username}}» или «Комментировать как {{user.username}} ', если пользователь аутентифицирован.

Вместо того, чтобы записывать имя пользователя в текстовое поле, оставляя комментарий, я хотел бы получить имя пользователя, если пользователь вошел в систему, и не просить пользователя ввести имя пользователя в текстовое поле, поскольку я считаю, что это не имеет смысла,Я думаю, что мне может понадобиться использовать виджеты в forms.py и использовать HiddenInputs () может быть?

Я прошу прощения, если я нарушаю какие-либо правила сообщества, поскольку недавно присоединился к этому сообществу и все еще пытаюсь выяснить нормы и правила.

models.py

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    published_date = models.DateTimeField(auto_now=True)

    def summary(self):
        """Return a summary for very long posts to
        get a glimpse from admin panel"""
        return self.text[:100]

    def pub_date_pretty(self):
        return self.published_date.strftime('%b %e, %Y')

    def __str__(self):
        """String representation"""
        return self.title

    def get_absolute_url(self):
        """Returns the url to access a detailed post"""
        return reverse('post-detail', kwargs={"pk": self.pk})

    class Meta:
        ordering = ['-published_date']
        unique_together = ('user',)

forms.py

from django import forms
from .models import Post, Comment

class PostForm(forms.ModelForm):
    class Meta():
        model = Post
        fields = ['user', 'title', 'text',]


class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('user', 'text',)

views.py

from django.shortcuts import render, redirect
from django.views.generic import TemplateView
from .models import Post, Comment
from django.utils import timezone
from django.views.generic import ListView, DetailView
from .forms import PostForm, CommentForm
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404

@login_required
def create_post(request):
    if request.method == 'POST':
        post_form = PostForm(request.POST)

        if post_form.is_valid():
            post = post_form.save(request)
            post.save()
        else:
            print(post_form.errors)
    else:
            post_form = PostForm()

    context = {
        'post_form': post_form,
    }

    return render(request, 'blog/addpost.html', context )

def add_comment_to_post(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == 'POST':
        form = CommentForm(request.POST)

        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.save()
            return redirect('post-detail', pk=pk)

    else:
        form = CommentForm()
    return render(request, 'blog/add_comment_to_post.html', {'form': form,
                                                             })

1 Ответ

2 голосов
/ 27 мая 2019

В Post.Meta вы определили ограничение unique_together только с пользователем в нем. Это должно быть удалено

class Meta:
    ordering = ['-published_date']
    unique_together = ('user',)  # This line here
...