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理员只是:

  1. 编辑你的admin.py并设置表单属性来引用你在上面创build的表单
  2. 在您的字段或字段集声明中包含您的新字段

喜欢这个:

 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') 

如果你绝对只想在模型中存储组合字段,而不是两个分开的字段,你可以做这样的事情:

我从来没有做过这样的事情,所以我不完全确定它会如何工作。