簡體   English   中英

如何使當前用戶成為Django模型中的外鍵

[英]How to make current user the foreign key in Django Model

我將Django admin用作客戶端的儀表板(受限權限)。 我允許他們通過管理站點添加新產品,並希望將當前用戶用作Products模型中的外鍵。 我在ProductAdmin中使用“排除”,因此客戶端將無法選擇更改它。 當不使用“排除”時,用戶是默認選擇,並且可以使用。 當我包含“ exclude”時,表單返回錯誤,指出該字段為null。 我如何使當前用戶成為產品模型中的外鍵,無論他們是通過管理表單添加項目還是通過csv上傳項目?

這是我的產品型號:

#models.py
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User

class Product(models.Model):
    client_id = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    title = models.CharField(max_length=200)
    asin = models.CharField(max_length=200, blank=True)
    sku = models.CharField(max_length=200, blank=True)
    date_added = models.DateTimeField(default=datetime.now, blank=True)
    in_report = models.BooleanField(default=True)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(client_id=request.user)

    def __str__(self):
        return self.title

#admin.py
from django.contrib import admin
from .models import Product

class ProductAdmin(admin.ModelAdmin):
    list_display = ('title', 'asin', 'sku', 'in_report')
    list_display_links = ('title', 'asin', 'sku')
    list_editable = ('in_report',)
    search_fields = ('title', 'asin', 'sku', 'in_report')
    list_per_page = 50
    exclude = ('client_id',)

admin.site.register(Product, ProductAdmin)

我相信您想向用戶隱藏client_id,但是在通過admin保存/更改對象時,您希望當前用戶得到保存。

現在,當您從admin中exclude client_id時,該字段將不會出現在表單中,這將引發錯誤,因為client_id是必填字段。因此,您可以使用save_model方法覆蓋admin的save_model方法:

def save_model(self, request, obj, form, change):
    # associating the current logged in user to the client_id
    obj.client_id = request.user
    super().save_model(request, obj, form, change)

因此,無論何時更改/添加對象,當前用戶都將被分配給client_id。希望它會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM