Django管理员:如何';预填充';基于父模型的内联外键字段

Django管理员:如何';预填充';基于父模型的内联外键字段,django,django-admin,inline,Django,Django Admin,Inline,关于的一些评论表明,有更直接和最新的解决方案。(我没有找到) (这样的评论:“是的,它已经解决了。只需在参数中传递相关实例,它就会预填充它…”让我觉得现在很容易,但仍然无法使它工作) 问题是,我想发送通知给一些用户,他们参与了给定的事件,并由管理员人员选择。 工作人员在事件页面上,选择事件并保存,内联中的fk字段应预先填充相关用户名。(并等待工作人员检查或取消检查以接收电子邮件通知) 出于可用性的原因,这应该采取内联的形式,因为有很多页面可以从员工那里收集所有必要的信息 有什么想法吗 class

关于的一些评论表明,有更直接和最新的解决方案。(我没有找到)

(这样的评论:“是的,它已经解决了。只需在参数中传递相关实例,它就会预填充它…”让我觉得现在很容易,但仍然无法使它工作)

问题是,我想发送通知给一些用户,他们参与了给定的事件,并由管理员人员选择。 工作人员在事件页面上,选择事件并保存,内联中的fk字段应预先填充相关用户名。(并等待工作人员检查或取消检查以接收电子邮件通知)

出于可用性的原因,这应该采取内联的形式,因为有很多页面可以从员工那里收集所有必要的信息

有什么想法吗

class When(models.Model):
    ...
    Date = models.DateTimeField(unique=True)
    Nameofevent = models.ForeignKey(Event, to_field='Name') #the Event model gets then username from models.ManyToManyField(User, through='Role')
    ...
    def getteam(self):
        teamlist = self.Nameofevent.Roleinevent.all() # gathering users which are involved
        return teamlist
    getteamresult = property(getteam)

class Notice(models.Model): #this will go to the inline
    ...
    Who = models.ForeignKey(User, blank=True)
    To_notice_or_not_to_notice = models.BooleanField(default=False)
    ...

class NoticeInline(admin.TabularInline):
    model = Notice
    extra = 9

class WhenAdmin(admin.ModelAdmin):
    list_display = ('Date', ...)
    readonly_fields = ('getteamresult', ) #this is to make clear i have access to what i want and i can display it. prints out as [<User: someone>, <User: someoneelse>]
    inlines = [NoticeInline] #but i want the User objects to prepopulate foreign field here in inline model
admin.site.register(When,WhenAdmin)
class时(models.Model):
...
日期=型号。日期时间字段(唯一=真)
nameofent=models.ForeignKey(事件,to_field='Name')#事件模型从models.ManyToManyField(用户,通过='Role')获取用户名
...
def getteam(self):
teamlist=self.nameofent.Roleinevent.all()#收集相关用户
返回团队列表
getteamresult=属性(getteam)
课堂通知(models.Model):#这将转到在线
...
Who=models.ForeignKey(用户,空白=True)
To_notice_或To_notice=models.BooleanField(默认值=False)
...
班级通知行(管理员列表行):
模型=通知
额外=9
类WhenAdmin(admin.ModelAdmin):
列表显示=('Date',…)
readonly_fields=('getteamresult',)#这是为了明确我有权访问我想要的内容,并且可以显示它。打印为[,]
inlines=[NoticeInline]#但我希望用户对象在内联模型中预先填充外部字段
管理站点注册(何时、何时、分钟)

我不认为内联线是实现这种功能的方式。如果应该提示工作人员向参与事件的用户发送电子邮件,并且需要控制哪些用户实际收到通知,那么您应该使用中间视图

首先,您需要一个表单,用于选择属于事件的用户。最初,我们将
users
字段设置为仅为所有用户,但在表单的
\uuuu init\uuuu
方法中,我们将采用“event”kwarg并基于此过滤字段

class UserNotifyForm(forms.Form):
    users = forms.ModelMultipleChoiceField(queryset=User.objects.all(), widget=forms.CheckboxSelectMultiple())

    def __init__(self, *args, **kwargs):
        event = kwargs.pop('event')
        super(UserNotifyForm, self).__init__(*args, **kwargs)
        if event:
            self.fields['users'].queryset = event.users.all()
其次,在
ModelAdmin
上创建一个视图,其行为与普通表单视图相同:

def notify_users_view(self, request, object_id):
    event = get_object_or_404(Event, id=object_id)
    if len(request.POST):
        form = UserNotifyForm(request.POST, event=event)
        if form.is_valid():
            users = form.cleaned_data.get('users')
            # send email
            return HttpResponseRedirect(reverse('admin:yourapp_event_changelist'))
    else:
        form = UserNotifyForm(event=event)

    return render_to_response('path/to/form/template.html', {
        'event': event,
        'form': form,
    }, context_instance=RequestContext(request))
当然,您需要为此创建模板,但这很简单。表单已经设置为显示复选框列表,每个用户一个复选框,因此您可以在那里获得所需的所有信息

第三,将此视图绑定到
ModelAdmin
的URL中:

def get_urls(self):
    urls = super(MyModelAdmin, self).get_urls()

    info = (self.model._meta.app_label, self.model._meta.module_name)

    my_urls = patterns('',
        (r'^(?P<object_id>\d+)/notify/$', self.notify_users_view, name='%s_%s_notify' % info)
    )
    return my_urls + urls

为什么不在用户模型上创建一个过滤器来过滤所有收到(或未收到)通知的用户,从而解决这个问题呢?然后您可以创建一个发送通知的管理操作。步骤是:筛选与给定戏剧有关的用户。而不是让员工指出他们中的哪些人将收到特定重播(事件)的通知-并非所有人都是必要的(例如,导演没有出席所有重播)。此操作是在员工提交有关此特定事件的所有其他信息时完成的。这使其更加清晰。那么,为什么不通过将多对多事件链接到用户来解决这个问题呢?它可以是一个小部件,也可以是一个。然后你可以向那些用户发送通知。我试图减少问题,让问题变得清楚,但事情并没有那么简单。用户不是直接M-M到事件的。有相当多的中间模型,如“角色”、“角色名称”等,在关系中起作用。剧场环境相当复杂,有时甚至混乱。我想让非技术人员尽可能轻松地填写我需要的所有信息:电子邮件通知、网页生成、为所有相关人员定制日程安排。。。现在我离我的圣杯如此之近;-)除非你解释清楚你想要什么,否则我们真的帮不了你。谢谢,我正试图得到你的大部分答案,但我肯定要把它和“何时”模型放在一页纸上。否则它会变得一团糟,并导致可用性灾难。最后,他们不会使用它。我相信这是可能的,我有我需要的所有信息,只是为了把它们连接起来。。。如果Django方法失败,我必须用js来实现(即使我的js技能很差)
def change_view(self, request, object_id, extra_context=None):
    response = super(MyModelAdmin, self).change_view(request, object_id, extra_context=extra_context)
    if len(request.POST):
        info = (self.model._meta.app_label, self.model._meta.module_name)
        response['Location'] = reverse('admin:%s_%s_notify', args=(object_id,))
    # Note: this will effectively negate the 'Save and Continue' and
    # 'Save and Add Another' buttons. You can conditionally check
    # for these based on the keys they add to request.POST and branch
    # accordingly to some other behavior you desire.
    return response