亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法匹配 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 關注
  • 151 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號