django admin – 添加不属于模型的自定义表单域
我有一个模型在pipe理网站注册。 其中一个字段是一个很长的stringexpression式。 我想添加自定义表单字段到该模型的pipe理中的添加/更新页面,基于这些字段值我将build立长stringexpression式并将其保存在相关的模型字段。
我怎样才能做到这一点?
更新:基本上我正在做的是从符号build立一个math或stringexpression式,用户select符号(这些是不是模型的一部分自定义字段),当他点击保存,然后我创build一个stringexpression式符号列表并将其存储在数据库中。 我不希望符号是模型和DB的一部分,只有最后的expression式。
无论是在你的admin.py中,还是在单独的forms.py中,你都可以添加一个ModelForm类,然后像通常那样在里面声明你的额外的字段。 我也给出了一个如何在form.save()中使用这些值的例子:
class YourModelForm(forms.ModelForm): extra_field = forms.CharField() def save(self, commit=True): extra_field = self.cleaned_data.get('extra_field', None) # ...do something with extra_field here... return super(YourModelForm, self).save(commit=commit) class Meta: model = YourModel
为了让额外的字段出现在pipe理员只是:
- 编辑你的admin.py并设置表单属性来引用你在上面创build的表单
- 在您的字段或字段集声明中包含您的新字段
喜欢这个:
class YourModelAdmin(admin.ModelAdmin): form = YourModelForm fieldsets = ( (None, { 'fields': ('name', 'description', 'extra_field',), }), )
更新:在Django 1.8中,你需要添加fields = '__all__'
__all__ fields = '__all__'
到YourModelForm的元类。
它可以在pipe理员中做,但是没有一个非常直接的方法。 另外,我想build议在模型中保留大多数业务逻辑,所以你不会依赖于Django Admin。
如果你的模型有两个独立的字段,也许会更容易一些(甚至更好)。 然后在你的模型上添加一个方法来结合它们。
例如:
class MyModel(models.model): field1 = models.CharField(max_length=10) field2 = models.CharField(max_length=10) def combined_fields(self): return '{} {}'.format(self.field1, self.field2)
然后在pipe理员中,您可以将combined_fields()
添加为只读字段:
class MyModelAdmin(models.ModelAdmin): list_display = ('field1', 'field2', 'combined_fields') readonly_fields = ('combined_fields',) def combined_fields(self, obj): return obj.combined_fields()
如果要将combined_fields
存储在数据库中,则可以在保存模型时将其保存:
def save(self, *args, **kwargs): self.field3 = self.combined_fields() super(MyModel, self).save(*args, **kwargs)
您可以随时创build新的pipe理模板,并在您的admin_view中执行所需的操作(将pipe理员添加到admin_view的url):
url(r'^admin/mymodel/mymodel/add/$' , 'admin_views.add_my_special_model')
如果你绝对只想在模型中存储组合字段,而不是两个分开的字段,你可以做这样的事情:
- 使用
ModelAdmin
上的form
属性创build自定义表单( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form ) - parsing
save_formset
方法中的自定义字段( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model )
我从来没有做过这样的事情,所以我不完全确定它会如何工作。