Django admin的自动作者

时间:2010-09-23 19:36:04

标签: django django-admin

所有。我正在为我的django网站管理员工作,而且我遇到了障碍。

我有一个Entry模型和一个Related模型。 Related模型有两个外键字段:一个用于Entry模型(entry),另一个用于django的User模型(author)。 Related模型被视为Entry模型的“子模型”,每个用户每Related只能有一个Entry

在管理员中,RelatedEntry内联编辑。我拥有它,管理员一次只显示一个额外的Related,它会自动用当前用户填充author字段:

from django.contrib import models
from django.contrib.auth.models import User

class Entry(models.Model):
    pass

class Related(models.Model):
    entry = models.ForeignKey(Entry)
    author = models.ForeignKey(User)
    class Meta:
        unique_together = ('entry', 'author')




from django.contrib import admin

class RelatedInline(admin.StackedInline):
    model = Related
    exclude = ('author',)
    max_num = 1

class EntryAdmin(admin.ModelAdmin):
    inlines = (RelatedInline,)
    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in filter(lambda obj: isinstance(obj, Related), instances):
             if instance.__dict__.get('author', None) is None:
                 instance.author = request.user
                 instance.save()
        formset.save_m2m()

问题在于,如果用户想要编辑已由任何人创建Related的条目,则只会显示该相关字段。

如果可能的话,我想知道是否有人对如何保持与此类似的设置有任何想法,但让管理员自动显示用户related(如果存在)和空表单(如果不存在)。除此之外,我只想摆脱行max_num = 1并将其替换为extra = 1。当然,这意味着即使用户已经有一个用于当前条目的“新相关”表单也会显示,所以我想知道是否有人知道如何捕获可能的IntegrityError并让用户知道发生了错误。

1 个答案:

答案 0 :(得分:0)

事实证明这很简单。您只需要在queryset类中添加RelatedInline函数,指定要显示的内联。如果返回的查询集至少有一个成员,则会显示第一个成员。如果查询集为空,将显示一个空白内联!

class RelatedInline(admin.StackedInline):
    model = Related
    exclude = ('author',)
    max_num = 1

    def queryset(request):
        return Related.objects.filter(author = request.user)