2013-08-16 22 views
3

我有两个模型,其中一个与其他内联。我已经使内联模型的字段只能读取。只读现有字段,但允许添加时,在Django中创建新的内联管理员

class FollowUpInLine(admin.TabularInline): 
model = md.FollowUp 
extra = 0 
can_delete = False 

def get_readonly_fields(self, request, obj=None): 
    if request.user.is_superuser == False:   
     if obj: # editing an existing object 
       return self.readonly_fields + (
       'follow_up_date', 
       'status_inquiry', 
       'remarks', 
       'followup_done_by', 
       ) 
    return self.readonly_fields 

然而,这并不允许添加新的领域时,“添加其他”被点击在线而是改变他们与价值“无”来标记。 如何让内联字段添加下一个内联时添加?

+1

我也有同样的问题http://stackoverflow.com/questions/11574795/django -inline-allow-adding-disable-editing – arulmr

+1

你得到的'obj'是父对象。它在Django的一个错误 - https://code.djangoproject.com/ticket/15602 – ssapkota

+0

是的,我还发现,内联add_permission需要更改权限,因为它创建一个中间模型,当添加被点击,没有更改权限中间中间无法更改,所以它试图添加时给出标签... https://github.com/django/django/blob/master/django/contrib/admin/options.py –

回答

1

我找到了答案。我们需要插入结构形式,然后调用从内嵌类这种形式,因为我已经做了(如下所示):

class RequiredInlineFormSet(BaseInlineFormSet): 
""" 
Generates an inline formset that is required 
""" 
    def _construct_form(self, i, **kwargs): 
    """ 
    Override the method to change the form attribute empty_permitted 
    """ 
     form = super(RequiredInlineFormSet, self)._construct_form(i, **kwargs) 
     form.empty_permitted = False 
     return form 

class FollowUpAddInLine(admin.TabularInline): 
    model = md.FollowUp 
    extra = 1 
    formfield_overrides = { 
    models.CharField: {'widget': TextInput(attrs={'size':'20'})}, 
    models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})}, 
} 

    can_delete = False 
    formset = RequiredInlineFormSet 

    def has_change_permission(self, request, obj=None): 
     return False 

class FollowUpListInLine(admin.TabularInline): 
    model = md.FollowUp 
    readonly_fields = ('status', 'follow_up_date', 'followup_status', 'followup_reason', 'remarks', 'followup_done_by') 
    extra = 0 
    can_delete = False 
    formset = RequiredInlineFormSet 

    def has_add_permission(self, request): 
     return False 

class FollowUpAdminInLine(admin.TabularInline): 
    model = md.FollowUp 
    extra = 1 
    formfield_overrides = { 
    models.CharField: {'widget': TextInput(attrs={'size':'20'})}, 
    models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})}, 
} 

    formset = RequiredInlineFormSet 

    def queryset(self, request): 
     return md.FollowUp.objects.filter(owner=request.user) 

class PackageAdmin(admin.ModelAdmin): 
"""Makes the FollowUp to be added along with the Package""" 
    inlines =(FollowUpListInLine, FollowUpAddInLine) 
    fields = ('date_of_inquiry', 'agent_name', 'type_of_booking', 
        'no_of_pax', 'source_of_inquiry', 'business_vendor', 
       'travel_date', 'reply_date', 'client_name', 
       'client_email', 'client_contacts', 'inquiry_assigned_to', 
       'inquiry_assigned_by') 
    list_display = ('agent_name', 'date_of_inquiry','status_color') 
    list_filter = ('date_of_inquiry',) 
    can_delete = False 
    list_per_page = 25 

    def get_readonly_fields(self, request, obj=None): 
    if request.user.is_superuser == False: 
     if obj: # editing an existing object 
      return self.readonly_fields + (
         'agent_name', 
         'date_of_inquiry', 
         ) 

     else: 
      self.inlines = (FollowUpAdminInLine,) 
     return self.readonly_fields 

    def queryset(self, request): 
"""Limit Pages to those that belong to the request's user.""" 
     qs = super(PackageAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(inquiry_assigned_to=request.user) 

admin.site.register(md.Package,PackageAdmin) 
相关问题