Django - 将默认所有者设置为登录用户



这是一个凹凸帖子。我尝试了各种方法,并浏览了这里的所有示例:

  • 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_bymodified_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 属性。

最新更新