为了账号安全,请及时绑定邮箱和手机立即绑定

无法匹配 django 中 get_user_model 的字段

无法匹配 django 中 get_user_model 的字段

月关宝盒 2023-12-11 16:35:45
我正在开发一个图书库存项目,用户可以在其中添加他们的图书,其他人也可以看到它们。我试图在主页上显示所有书籍,但只有所有者才能看到“编辑”和“删除”选项。其他人将看到“查看详细信息”选项。当用户添加新书时,我使用 Django 的 get_user_model() 功能来获取该书的所有者:...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 模板的 ID:...{% 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 %}...我也分别带来了用户名和所有者以进行比较。我仍然获得所有书籍的展示详细信息。对于调试,我还尝试将 'user.username' 和 'book.owner' 等同于 'jitesh2796' 。虽然前者有效,但后者无效。所以我猜问题出在 django 领域的某个地方。
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

你应该使用:


{% if request.user == book.owner %}

    …

{% endif %}

但尽管如此,在模板中进行过滤并不是一个好主意。您应该在视图中进行过滤,以便过滤可以在数据库级别进行。例如:


from django.views.generic import ListView

from django.contrib.auth.mixins import LoginRequiredMixin


class BookListView(LoginRequiredMixin, ListView):

    model = Book

    # …


    def get_queryset(self, *args, **kwargs):

        return super().get_queryset(*args, **kwargs).filter(

            owner=self.request.user

        )

注意:文档建议使用AUTH_USER_MODEL设置 [Django-doc]而不是 get_user_model()[Django-doc]。这更安全,因为如果身份验证应用程序尚未加载,设置仍然可以指定模型的名称。因此最好这样写:


from django.conf import settings


class Book(models.Model):

    # …

    owner = models.ForeignKey(

        settings.AUTH_USER_MODEL,

        on_delete=models.CASCADE

    )


查看完整回答
反对 回复 2023-12-11
?
BIG阳

TA贡献1859条经验 获得超6个赞

您需要更新模板中的条件


{% if user.username == book.owner.username  %}

....

{% endif %}


查看完整回答
反对 回复 2023-12-11
  • 2 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信