这是一个凹凸帖子。我尝试了各种方法,并浏览了这里的所有示例:
- https://stackoverflow.com/a/4672123/6274043
- https://stackoverflow.com/a/5529770/6274043
- 如何为 Django 外键模型或 AdminModel 字段指定默认值?
一切似乎都不适合我。
# models.py in main/ app
from django.contrib.auth.models import User
class Mileage(models.Model):
owner = models.ForeignKey(User)
date = models.DateField()
... #other parameters
#admin.py
class MileageAdmin(admin.ModelAdmin):
list_display = ['date', ...]
def save_model(self, request, instance, form, change):
user = request.user
instance = form.save(commit=False)
instance.owner= user
instance.save()
form.save_m2m()
return instance
#views.py
def home(request):
form = MileageForm(request.POST or None)
context = {"form": form}
if form.is_valid():
instance = form.save()
form = MileageForm()
context = {"form": form}
return render(request, 'record_trip.html', context)
我正在尝试将默认owner
设置为登录用户。我尝试像其他帖子一样ModelAdmin
这样做,但似乎不起作用。任何善良的灵魂都能指出我哪里做错了?
它一直在扔IntegrityError owner_id cannot be null
.
如果我犯了上面的基本错误,请原谅我。半年前,我开始为休闲编程。
不确定我是否正确理解了这个问题。您正在尝试将登录用户设置为新创建的模型的默认所有者?
目前,您仅将created_by
和modified_by
设置为默认为登录用户。
#admin.py
class MileageAdmin(admin.ModelAdmin):
...
def save_model(self, request, instance, form, change):
user = request.user
instance = form.save(commit=False)
if not change or not instance.created_by:
instance.created_by = user
instance.modified_by = user
instance.save()
form.save_m2m()
return instance
但是这两个字段在您的示例模型中甚至不存在
class Mileage(models.Model):
owner = models.ForeignKey(User)
date = models.DateField()
... #other parameters
但是,您实际上从未instance.owner
设置为request.user
。所以instance.owner
还有待None
,这就是 Django 抱怨的原因。
您需要在save()
实例之前进行设置。
class MileageAdmin(admin.ModelAdmin):
...
def save_model(self, request, instance, form, change):
instance.owner = request.user
if not change or not instance.created_by:
instance.created_by = request.user
instance.modified_by = request.user
instance.save()
form.save_m2m()
return instance
的 save 方法在您有机会将其设置为 request.user 之前就被调用了。
你可以找出它发生在哪里(也许其他答案可能会更好地了解它在哪里发生?),或者如果你想要一个快捷方式,你可以将owner
属性设置为不是必填字段,相信你稍后会设置它。
owner = models.ForeignKey(User, blank=True, null=True)
这样,在没有所有者的情况下创建模型不会引发完整性错误,但您可以相信最终会设置 owner 属性。