Использование операторов if, чтобы узнать, создал ли пользователь сообщение - PullRequest
0 голосов
/ 10 июля 2020

У меня есть проект django, в котором пользователь может создать сообщение и выбрать категорию, в которой оно должно быть. В моем текущем коде есть 2 категории («действие» и «спорт») с использованием 4 представлений, 1 представление отображается все категории: 1 содержит форму для загрузки сообщения, а 2 других представления отображают только одну из категорий. Я хочу сделать так, чтобы все пользователи, которые сделали сообщение, могли видеть сообщения других людей, если нет, они должны создавать его; это своего рода проблема, поскольку, если пользователь вводит URL-адрес в браузере, он сможет видеть сообщения других людей, даже если пользователь не создал их. Я знаю, что в файле views.py должны быть некоторые операторы if, но я уже пробовал несколько способов сделать это, и это все еще не работает. Любая идея решить эту проблему помогает.

models.py

CATEGORY_CHOICES = (
    ('action', 'action'),
    ('sports', 'sports'),
)

class Mates(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='usermates', unique=True)
    categories = models.CharField(choices=CATEGORY_CHOICES, default="choose...", max_length=10)
    req_bio = models.CharField(max_length=400)
    req_image = models.ImageField(upload_to='requestmates_pics', null=True, blank=True, default=False)

views.py (matesmain отображает все сообщения, mates_action только сообщения, относящиеся к категории действий, mates_sports только для спорта category и mates отображает форму для создания сообщения)

def matesmain(request):
    contents = Mates.objects.all()
    action = Mates.objects.filter(categories='action')
    sports = Mates.objects.filter(categories='sports')
    
    context = {
        'contents': contents,
        'action' : action,
        'sports' : sports,
    }
    print("nice3")
    return render(request, 'mates.html', context)

def mates_action(request):
    action = Mates.objects.filter(categories='action')

    context = {
        'action' : action,
    }
    print("nice3")
    return render(request, 'mates-action.html', context)

def mates_sports(request):
    sports = Mates.objects.filter(categories='sports')

    context = {
        'sports' : sports,
    }
    print("nice3")
    return render(request, 'mates-sports.html', context)



def mates(request):
    if request.method == 'POST':
        form_mates = MatesForm(request.POST, request.FILES)
        if form_mates.is_valid():
            instance = form_mates.save(commit=False)
            instance.user = request.user
            instance.save()
            return redirect('mates-main')
            print('succesfully uploded')

    else:
        form_mates = MatesForm()
        print('didnt upload')
    return redirect('mates-main')

urls.py

urlpatterns = [
    path('mates', views.mates, name='mates'),
    path('mates-main', views.matesmain, name='mates-main'),
    path('mates/action', views.mates_action, name='mates-action'),
    path('mates/sports', views.mates_sports, name='mates-sports'),

]

Если у вас есть вопросы, дайте мне знать в комментариях;)

1 Ответ

1 голос
/ 10 июля 2020

Вы можете добавить метод к пользователю, таким образом с IF вы можете спросить вот так:

from django.contrib.auth.models import User 

def has_posts(self):
    if Post.objects.filter(user=self).count() > 0:
        return True
    return False

User.add_to_class("has_posts",has_posts)

def some_view(request):

    if request.user.has_posts():
        return the view
    else:
        return (redirect to error view)


...