#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
для этого объект, как указано в ответе. Кроме того, конечно, если вы его развернете, «тестовые» данные будут потеряны.