Не удалось сопоставить поле из get_user_model в django - PullRequest
1 голос
/ 11 апреля 2020

Я работаю над проектом инвентаризации Книг, где пользователи могут добавлять свои книги, а другие могут их видеть.

То, что я пытаюсь на домашней странице показать все книги, но увидит только владелец опции «Редактировать» и «Удалить». Другие увидят опцию «Подробнее».

Я использовал функцию get_user_model () Django, чтобы получить владельца книги, когда пользователь добавляет новую книгу:

...
class Book(models.Model):
    title =models.CharField(max_length =255)
    author =models.CharField(max_length =255)
    genre =models.CharField(max_length=255)
    date=models.DateTimeField(auto_now_add =True)
    owner =models.ForeignKey(get_user_model(),on_delete =models.CASCADE,)
...

Теперь, когда я отображаю имя пользователя и владельца книги, это не работает. Этот шаблон HTML:

...
{% for book in object_list %}
<div class="card">
    <span class="font-weight-bold">{{book.title}}</span> 
    <span class="font-weight-bold">by {{book.author}}</span>
    <span class="text-muted">Genre: {{book.genre}}</span>
    <span class="text-muted">Owner: {{book.owner}}</span>
    <span class="text-muted">User: {{user.username}}</span>
    <div class="card-footer text-center text-muted">
        {% if user.username == book.owner  %}
         <a href ="{% url 'book_edit' book.pk %}">Edit</a> | <a href="{% url 'book_delete' book.pk %}">Delete</a>
         {% else %}
         <a href="#">Show Details</a>
         {% endif %}
        </div>
</div>
<br />
{% endfor %}
...

Я привожу и имя пользователя, и владельца отдельно для сравнения. Тем не менее я получаю подробности показа для всех книг.

enter image description here

Для отладки я также попытался приравнять и user.username, и book.owner 'to' jitesh2796 '. Хотя первый работает, а второй нет. Так что, я думаю, проблема где-то в поле django.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Вам необходимо обновить условие в шаблоне

{% if user.username == book.owner.username  %}
....
{% endif %}
1 голос
/ 11 апреля 2020

Вы должны использовать:

{% if <b>request.user == book.owner</b> %}
    &hellip;
{% endif %}

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

from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin

class BookListView(LoginRequiredMixin, ListView):
    model = Book
    # &hellip;

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            <b>owner=self.request.user</b>
        )

Примечание : документация рекомендует использовать настройку AUTH_USER_MODEL [ Django -doc] сверх get_user_model() [Django -doc] . Это безопаснее, поскольку, если приложение аутентификации еще не загружено, в настройках все равно можно указать имя модели. Поэтому лучше написать:

from django.conf import settings

class Book(models.Model):
    # &hellip;
    owner = models.ForeignKey(
        <b>settings.AUTH_USER_MODEL</b>,
        on_delete=models.CASCADE
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...