商店表单字段键值/各行

问题描述:

我在Django的一个简单的形式,看起来像这样:商店表单字段键值/各行

class SettingForm(forms.Form): 
    theme = forms.CharField(rrequired=True, 
     initial='multgi' 
    ) 
    defaultinputmessage = forms.CharField(required=True, 
     initial='Type here to begin..' 
    ) 

...并保存它看起来像模型:

class Setting(models.Model): 
    name = models.CharField(
     null=False, max_length=255 
    ) 
    value= models.CharField(
     null=False, max_length=255 
    ) 

提交表单时,如何将表单字段存储为键值对,然后在呈现页面时,如何使用键的值初始化表单。我试过寻找这个实现,但一直无法找到一个。

任何帮助?

谢谢。

+0

表单字段输入(在request.POST中)是一个字典,它本质上是键/值对。请阅读django HttpRequest对象的文档,特别是POST属性。然后**更新**您的问题,以更详细地解释您想要做什么。包括“伪代码”或一些破解的解释。 –

这是我是如何做到的。

我需要这样做,因为我有一个模型将信息存储为键值对,我需要在该模型上构建ModelForm,但ModelForm应该将键值对显示为字段,即将行转到列。默认情况下,模型的get()方法总是返回自己的模型实例,我需要使用自定义模型。下面是我的键 - 值对模型看起来像:

class Setting(models.Model): 
    domain = models.ForeignKey(Domain) 
    name = models.CharField(null=False, max_length=255) 
    value = models.CharField(null=False, max_length=255) 

    objects = SettingManager() 

我建立了一个自定义的经理在这个覆盖get()方法:

class SettingManager(models.Manager): 

    def get(self, *args, **kwargs): 
     from modules.customer.proxies import * 
     from modules.customer.models import * 

     object = type('DomainSettings', (SettingProxy,), {'__module__' : 'modules.customer'})() 
     for pair in self.filter(*args, **kwargs): setattr(object, pair.name, pair.value) 

     setattr(object, 'domain', Domain.objects.get(id=int(kwargs['domain__exact']))) 
     return object 

该经理将实例化这个抽象模型的实例。 (抽象模型没有表,以便Django不扔了错误)

class SettingProxy(models.Model): 

    domain = models.ForeignKey(Domain, null=False, verbose_name="Domain") 
    theme = models.CharField(null=False, default='mytheme', max_length=16) 
    message = models.CharField(null=False, default='Waddup', max_length=64) 

    class Meta: 
     abstract = True 

    def __init__(self, *args, **kwargs): 
     super(SettingProxy, self).__init__(*args, **kwargs) 
     for field in self._meta.fields: 
      if isinstance(field, models.AutoField): 
       del field 

    def save(self, *args, **kwargs): 
     with transaction.commit_on_success(): 
      Setting.objects.filter(domain=self.domain).delete() 

      for field in self._meta.fields: 
       if isinstance(field, models.ForeignKey) or isinstance(field, models.AutoField): 
        continue 
       else: 
        print field.name + ': ' + field.value_to_string(self) 
        Setting.objects.create(domain=self.domain, 
         name=field.name, value=field.value_to_string(self) 
        ) 

该代理具有的一切,我想在我的ModelFom显示并存储为在我的模型键值对的领域。现在,如果我需要添加更多的字段,我可以简单地修改这个抽象模型,而不必编辑实际模型本身。现在我有一个模型,我可以简单地在它上面构建一个ModelForm,如下所示:

class SettingsForm(forms.ModelForm): 

    class Meta: 
     model = SettingProxy 
     exclude = ('domain',) 

    def save(self, domain, *args, **kwargs): 
     print self.cleaned_data 
     commit = kwargs.get('commit', True) 
     kwargs['commit'] = False 
     setting = super(SettingsForm, self).save(*args, **kwargs) 
     setting.domain = domain 
     if commit: 
      setting.save() 
     return setting 

我希望这会有所帮助。它需要通过API文档进行大量挖掘才能弄清楚。

我假设你想存储'主题'作为名称和值作为值,defaultinputmessage相同。如果是这样的话,这应该工作:

form = SettingForm({'theme': 'sometheme', 'defaultinputmessage': 'hello'}) 
if form.is_valid(): 
    for key in form.fields.keys(): 
     setting = Setting.objects.create(name=key, value=form.cleaned_data[key])