Django подтвердить запрос пользователя - PullRequest
0 голосов
/ 17 марта 2019

Я всего лишь студент и в настоящее время изучаю джанго. У меня есть это в моем Users / models.py

class Membership(models.Model):
membership_type = models.CharField(max_length=50)
price = models.IntegerField(default=100)
description = models.CharField(max_length=200)

def __str__(self):
    return self.membership_type





class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
membership = models.ForeignKey(Membership, on_delete=models.CASCADE,null=True)
reference = models.CharField(max_length=50, null=True)

def __str__(self):
    return self.user.email

вот мои views.py

def BookDetail(request, id):
most_recent = Book.objects.order_by('-timestamp')[:3]
user_membership = get_object_or_404(Customer, user=request.user)
book= get_object_or_404(Book, id=id)
form = CommentForm(request.POST or None)
if request.method == "POST":
    if form.is_valid():
        form.instance.user = request.user
        form.instance.post = book
        form.save()
        return redirect(reverse("book-detail", kwargs={
            'id': book.pk
        }))
context = {
    'user_membership': user_membership,
    'form': form,
    'book': book,
    'most_recent': most_recent,

}
return render(request, 'catalog/book_detail.html', context)

как мне проверить пользователя, если он / она не является частью модели Customer в моем book_detail.html (ПРИМЕЧАНИЕ: ИЗМЕНЕНО)

       {% if request.user != user_membership.user %}
          <button class="site-btn" disabled="disabled">Read</button>
          {% else %}
          {% for content in book.pages %}
         <a href="{{ content.get_absolute_url }}" class="site-btn">Read</a>
          {% endfor %}
        {% endif %}

У меня ошибка «Ни один клиент не соответствует заданному запросу». Хм, я вручную добавил пользователя в модель Клиента в админ-панели. он не добавляется автоматически при регистрации (сигналы). но я в порядке с этим.

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Вы используете переменную контекста user_membership для вашего Customer объекта. Это означает, что вы должны использовать это имя при поиске объекта Customer в вашем шаблоне. Например:

{% if request.user != user_membership.user %}

Кроме того, вы также должны убедиться, что у вас в settings.py установлен *1009* обработчик контекста запроса Django , который позволяет вам использовать request объект в вашем шаблоне:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': (
                'django.template.context_processors.request',
            ),
        }
    },
]

Обновление

Если нет записи Customer, настроенной для текущего вошедшего в систему пользователя, то код в настоящее время вернет браузер 404. Однако, если вы хотите продолжить визуализацию шаблона в этом случае, вам следует изменить представление так, чтобы для переменной user_membership было установлено значение None:

def BookDetail(request, id):
    most_recent = Book.objects.order_by('-timestamp')[:3]
    try: 
        user_membership = Customer.objects.get(user=request.user)
    except Customer.DoesNotExist:
        user_membership = None

А затем измените ваш шаблон, чтобы проверить, установлен ли user_membership:

{% if user_membership and user_membership.user == request.user %}
    {% for content in book.pages %}
        <a href="{{ content.get_absolute_url }}" class="site-btn">Read</a>
    {% endfor %}
{% else %}
    <button class="site-btn" disabled="disabled">Read</button>
{% endif %}
0 голосов
/ 17 марта 2019

Вы должны использовать что-то вроде ..

    {% if request.user != customer.user %}
         # disable read btn
    {% else %}
         # show read link
    {% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...