ускоренный курс python делает записи django доступными для незарегистрированных пользователей

#python #django

#python #django

Вопрос:

В настоящее время я пытаюсь выполнить это упражнение ускоренного курса python и не уверен, как с ним поступить. Вот упражнение, о котором идет речь.

 Then try adding a more advanced feature,
such as giving users the option of making a topic public. This would require an
attribute called public as part of the Topic model (this should be set to False
by default) and a form element on the new_topic page that allows the user to
change a topic from private to public.
 

Вот изменения, которые я уже внес в forms.py Насколько
я понимаю, когда пользователь вводит в «общедоступный» текст bos либо «True», либо «False», общедоступный атрибут тематической модели будет обновлен соответствующим образом?

 from django import forms

from .models import Topic, Entry

class TopicForm(forms.ModelForm):
    class Meta:
        model = Topic
        fields = ['text', 'public']
        labels = {'text': '', 'public' : "True/False"}

class EntryForm(forms.ModelForm):
    class Meta:
        model = Entry
        fields = ['text']
        labels = {'text': 'Entry:'}
        widgets = {'text': forms.Textarea(attrs={'cols': 80})}
 

модель темы в models.py

 from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Topic(models.Model):
    """A topic the user is learning about."""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    public = models.BooleanField(default=False)

    def __str__(self):
        """Return a string representation of the model."""
        return self.text
 

Мое текущее предположение заключается в том, что в views.py в разделе «Темы» я должен отредактировать его таким образом, чтобы он проверял либо идентификатор владельца, либо то, не был ли просмотрщик зарегистрирован, а затем соответствующим образом возвращает все общедоступные темы. Поэтому я любезно прошу подтолкнуть вас в правильном направлении или около того. Спасибо всем!

текущие темы функционируют в views.py

 @login_required
def topics(request):
    """Show all topics."""
    topics = Topic.objects.filter(owner=request.user).order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)
 

Окончательный код после получения справки:
forms.py

 class TopicForm(forms.ModelForm):
    class Meta:
        model = Topic
        fields = ['text', 'public']
        labels = {'text': '', 'public' : "Tick to set to public"}
 

models.py

 class Topic(models.Model):
    """A topic the user is learning about."""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    public = models.BooleanField(default=False)

    def __str__(self):
        """Return a string representation of the model."""
        return self.text
 

views.py

 def topics(request):
    """Show all topics."""
    if request.user.is_authenticated:
        topics = Topic.objects.filter(owner=request.user).order_by('date_added')
    else:
        topics = Topic.objects.filter(public=True).order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)
 

Ответ №1:

Вы можете проверить, вошел ли пользователь в систему, и в зависимости от этого фильтровать только общедоступные элементы или общедоступные элементы в сочетании с элементами, владельцем которых является пользователь:

 from django.db.models import Q

def topics(request):
    if request.user.is_authenticated:
        topics = Topic.objects.filter(…)
    else:
        topics = Topic.objects.filter(…)
    topics = topics.order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context) 

С частями, которые вам все еще нужно заполнить. Для части, где пользователь проходит проверку подлинности, вам понадобятся Q объекты [Django-doc] для реализации логической дизъюнкции.

Комментарии:

1. Спасибо за помощь, сэр! Наконец-то понял 🙂

2. РЕДАКТИРОВАТЬ: Извините, сэр, он отлично работает, когда я запускаю сервер локально, но по какой-то причине теперь даже просмотр страницы тем на моей странице heroku выдает ошибку.

3. @BobTan: что именно вы заполнили ... ?

4. темы = Topic.objects.filter(владелец = request.user).order_by(‘date_added’) и темы = Topic.objects.filter(public= True). order_by(‘date_added’)

5. Но в случае, если пользователь аутентифицирован, вам, вероятно, нужны как общедоступные сообщения, так и сообщения пользователя, вы используете Q для этого объект, как указано в ответе. Кроме того, конечно, если вы его развернете, «тестовые» данные будут потеряны.