2009-07-09 67 views
1

我从POST获取数据,并通过这个标准片段验证它:更改数据

entry_formset = EntryFormSet(request.POST, request.FILES, prefix='entries') 
if entry_formset.is_valid(): 
    .... 

的EntryFormSet的ModelForm覆盖的外键字段的控件来呈现的文本字段。这样,用户可以输入一个现有的密钥(通过Ajax实时搜索建议),或者输入一个新密钥,该密钥将被无缝添加。

我使用这个try-except块来测试对象是否已经存在,如果没有,我添加它。

entity_name = request.POST['entries-0-entity'] 
try: 
    entity = Entity.objects.get(name=entity_name) 
except Entity.DoesNotExist: 
    entity = Entity(name=entity_name) 
    entity.slug = slugify(entity.name) 
    entity.save() 

不过,我现在需要得到entityentry_formset。它认为entries-0-entity是一个字符串(就是这样);我如何直接访问entry_formset的值,并让它取而代之的是对象引用?

+0

问题不明确。第二个代码段在哪里发生?如果您发布更多视图,这可能会有所帮助。 – 2009-07-10 08:33:44

回答

2

我会建议为您的表单集编写一个辅助工厂函数,以便您可以根据数据自定义显示小部件。像下面这样:

def make_entry_formset(initial_obj=None, custom_widget=forms.Textarea): 
    # these will be passed as keyword arguments to the ModelChoiceField 
    field_kwargs={'widget': custom_widget, 
        'queryset': Entity.objects.all()} 
    if initial_obj is not None: 
     field_kwargs.update({'initial': initial_obj}) 
    class _EntryForm(forms.ModelForm): 
     entity = forms.ModelChoiceField(**field_kwargs) 

     class Meta: 
      model = Entry 
    return modelformset_factory(Entry, form=_EntryForm) 

然后在您的视图代码,你可以指定你想要的部件,以及是否绑定到初始Entity对象。如果你想再次渲染它(is_valid()块之后)与Entity对象

formset_class = make_entry_formset(custom_widget=forms.Textarea) 
entry_formset = formset_class() 

然后:对于表单集,在这里你只想要一个Textarea小部件,无初始选择的初始渲染,您可以使用此已经定义,您可以使用此:

formset_class = make_entry_formset(initial_obj=entity, 
            custom_widget=forms.HiddenInput) 
entry_formset = formset_class(request.POST, request.FILES) 

你可以使用任何你喜欢的小工具,当然,但使用HiddenInput将防止最终用户从本场的相互作用(你似乎要绑定的你看起来变量为entity)。