Как обойти запрос имени пользователя у конечного пользователя при добавлении сообщения в блоге с помощью формы и автоматически отображать вошедшего в систему пользователя в качестве автора сообщения?

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

Я пытался не включать поле «пользователь» в поля форм, но оно кажется обязательным. Может быть, мне нужно просто скрыть это как-то с помощью виджетов? В шаблонах я мог бы написать следующее:

{% if user.is_authenticated %}
   <p>Posting as {{request.user}}</p>
{% else %}
   <p><a href = {% url 'register' %}Please register to add a blog post</a></p>
{% endif %}

Хотя я не уверен, я думаю, что было бы разумнее иметь логику в моем файле views.py.

Вот мой файл blog.models:

class Post(models.Model):
    user            = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
    title           = models.CharField(max_length=200)
    slug            = models.SlugField(unique=True)
    text            = models.TextField()
    published_date  = models.DateTimeField(auto_now=True)
    # pip install Pillow
    image           = models.ImageField(null=True, blank=True,
                                        upload_to='photos/%Y/%m/%d/',)


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

    def _get_unique_slug(self):
        """Assigns a number to the end of a given slug field to prevent
        duplicated slug error. if title of a post is 'ayancik', and another
        user creates another post with the same title, second posts' slug
        is assigned a value: 'ayancik-2'"""
        slug = slugify(self.title)
        unique_slug = slug
        num = 1
        while Post.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, num)
            num += 1
        return unique_slug

    def save(self, *args, **kwargs):
        """Automatically assign slug to objects
        by overriding save method"""
        self.slug = self._get_unique_slug()
        super().save(*args, **kwargs)

    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):
        # what does kwargs = {'slug':self.slug} really achieve here?
        # where would we use 'key-value' pair?
        """Returns the url to access a detailed post"""
        return reverse('post-detail', kwargs = {"slug": self.slug})

    class Meta:
        ordering = ['-published_date',]


class Comment(models.Model):
    post                = models.ForeignKey('blog.Post', on_delete=models.CASCADE,
                             related_name='comments')
    user                = models.CharField(max_length=200)
    text                = models.TextField()
    created_date        = models.DateTimeField(default=timezone.now)
    approved_comment    = models.BooleanField(default=False)

    def approve_comment(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.text

Файл 'blog.forms':

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

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

и файл 'blog.views':

@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:
            # when not POST request, display the empty form
            # meaning -> if request.method=='GET':
            post_form = PostForm()

    context = {
        'post_form': post_form,
    }

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

def add_comment_to_post(request, slug):
    post = get_object_or_404(Post, slug=slug)
    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', slug=slug)

    else:
        form = CommentForm()
    template_name = 'blog/add_comment_to_post.html'
    return render(request, template_name , {'form': form })
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы опускаете пользователя в PostForm:

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

или мы можем отобразить все поля, кроме 'user', например:

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        exclude = ('user', )

а затем вы добавляете пользователя в экземпляр в своем представлении:

from django.shortcuts import redirect

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

        if post_form.is_valid():
            post = post_form.save(commit=False)
            post.user = request.user
            post.save()
            return redirect('some_view')
    else:
        post_form = PostForm()

    context = {
        'post_form': post_form,
    }

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

Таким образом, commit=False предотвращает сохранение объекта Post в базе данных.

Поскольку вы хотите загрузить image, вы также должны передать request.FILES [Джанго-док] в PostForm, иначе вы не будете обрабатывать загруженные файлы. Кроме того, вам нужно указать, что вы используете enctype = "multipart/form-data" в своей форме:

<form enctype = "multipart/form-data" method = "POST" action = "{% url 'create_post' %}">
    ...
</form>

Лучше использовать redirect [Джанго-док] в случае успешного POST-запроса, так как это Опубликовать/перенаправить/получить шаблон [вики]. При рендеринге новой формы, если пользователь обновит страницу, он/она создаст второй пост, что, вероятно, не то, что вам нужно.

Другие вопросы по теме