我使用 Django admin 作为客户端的仪表板(受限权限)。我允许他们通过管理站点添加新产品,并希望使用当前用户作为产品模型中的外键。我在 ProductAdmin 中使用“排除”,因此客户将无法选择更改它。当不使用“排除”时,用户是默认选择,它可以工作。当我包含“排除”时,表单返回一个错误,指出该字段为空。如何使当前用户成为 Products 模型中的外键,无论他们是通过管理表单添加项目还是通过 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 保存/更改对象时,您希望当前用户被保存。
现在,当您exclude
从 admin 获取 client_id时,该字段将不会出现在表单中,这将引发错误,因为 client_id 是必填字段。因此您可以save_model
将 admin的方法重写为:
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.Hope 它会有所帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句