2015-02-24 59 views
0

我有在我指定的模板和自定义窗体使用Django管理自定义窗体不保存

class StoryAdmin(BaseAdmin): 
    form = Edit_Story_Form 
    change_form_template = "CMS/Editorial/AdminStory/AdminStory.html" 

    def change_view(self, request, object_id, form_url='', extra_context=None): 
     extra_context = extra_context or {} 
     thing = Story.objects.get(pk=object_id) 
     extra_context['workflowstate'] = thing.workflowstate.title() 
     extra_context['last_updated'] = thing.updateddate 
     return super(StoryAdmin, self).change_view(request, object_id, form_url, extra_context=extra_context) 

admin.site.register(Story, StoryAdmin) 

形式的自定义Django管理如下:

class Edit_Story_Form(ModelForm): 
headline = forms.CharField() 
subheadline = forms.CharField() 
add_block = forms.CharField(widget=forms.HiddenInput(), label='', required=False) 

class Meta: 
    model = Story 
    fields = [] 

def __init__(self, *args, **kwargs): 
    self.request = kwargs.pop('request', None) 
    request = self.request 
    super(Edit_Story_Form, self).__init__(*args, **kwargs) 
    zones = Zone.objects.filter(story=self.instance) 
    for zone in zones: 
     zone.form = Edit_Zone_Form(
      request.POST or None, 
      request.FILES or None, 
      instance = zone, 
      prefix = "zone_"+str(zone.id), 
     ) 
     blocks = Block.objects.filter(zone=zone).filter(has_parent=False) 
     for block in blocks: 
      block_forms = { 
       "Text":  Edit_Text_Block_Form, 
       "Image": Edit_Image_Block_Form, 
       "Video": Edit_Video_Block_Form, 
       "Embed": Edit_Embed_Block_Form, 
       "Code":  Edit_Code_Block_Form, 
       "Live Blog":Edit_Live_Blog_Block_Form, 
       "Tweet": Edit_Tweet_Block_Form, 
       "Quiz":  Edit_Quiz_Block_Form, 
       "Slideshow":Edit_Slideshow_Block_Form, 
       "Curated": Edit_Curated_Block_Form 
      } 
      block.form = block_forms[block.block_type](
       request.POST or None, 
       request.FILES or None, 
       instance = block.get_instance(), 
       prefix = "block_"+str(block.id), 
      ) 

def save(self, *args, **kwargs): 
    print("HI") 
    super(Edit_Story_Form, self).save(*args, **kwargs) 

如果我在表单中取出自定义保存方法,它可以正常工作,并且表单的字段保存。但是,我将需要重写保存,因为此表单中包含其他表单,我将在保存时进行验证。

添加在我的保存方法使得页面扔了一个错误:

AttributeError at /admin/Editorial/story/1/ 
'NoneType' object has no attribute 'save' 

我见过引用到管理的save_object方法,但因为我其实希望能挽救我的表单对象,我不认为这是我正在寻找的。任何想法为什么我可能会得到这个错误?

谢谢!

+0

能否请您编辑和格式正确的代码? – thefourtheye 2015-02-24 14:34:58

回答

2

我想你忘记了return语句

def save(self, *args, **kwargs): 
    print("HI") 
    return super(Edit_Story_Form, self).save(*args, **kwargs) 
+0

这解决了我的问题!我不知道我必须在Admin中保存回报(我通常不会使用表格)。感谢您的支持! – 2015-02-24 17:56:28