Answers:
您可以在admin.py或单独的forms.py中添加一个ModelForm类,然后像往常一样在其中声明额外的字段。我还给出了一个示例,说明如何在form.save()中使用这些值:
from django import forms
from yourapp.models import YourModel
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
要使其他字段仅出现在管理员中:
像这样:
class YourModelAdmin(admin.ModelAdmin):
form = YourModelForm
fieldsets = (
(None, {
'fields': ('name', 'description', 'extra_field',),
}),
)
更新:在django 1.8中,您需要添加fields = '__all__'
到YourModelForm的元类。
fields = '__all__'
您的Meta
课程,否则django会抱怨:Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated
YourModelAdmin.list_display[0], 'extra_field' is not a callable or an attribute of 'YourModelAdmin' or found in the model 'YourModel'.
AttributeError: Unable to lookup "extra_field"...
,请尝试label
在extra_field
定义中添加。看来django会通过查看Model
和ModelAdmin
定义此类属性定义来尝试“猜测”标签。
Unknown field(s) (extra_field) specified for YourModel. Check fields/fieldsets/exclude attributes of class YourModelAdmin.
。解决方法是extra_field = forms.CharField(widget=forms.HiddenInput())
可以在管理中执行操作,但是没有非常简单的方法。另外,我也建议您在模型中保留大多数业务逻辑,这样您就不必依赖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)
然后,您可以在admin中将combined_fields()
as 添加为只读字段:
class MyModelAdmin(models.ModelAdmin):
list_display = ('field1', 'field2', 'combined_fields')
readonly_fields = ('combined_fields',)
def combined_fields(self, obj):
return obj.combined_fields()
如果要将s存储combined_fields
在数据库中,也可以在保存模型时将其保存:
def save(self, *args, **kwargs):
self.field3 = self.combined_fields()
super(MyModel, self).save(*args, **kwargs)
save()
方法将其保存到数据库,检查我的答案的更新。
Django 2.1.1主要答案使我无法回答问题。它并没有帮助我将结果保存到实际模型中的字段中。在我的情况下,我希望用户可以在其中输入数据的文本字段,然后在进行保存时处理数据,并将结果放入模型的字段中并保存。虽然原始答案显示了如何从额外字段中获取值,但至少在Django 2.1.1中并未显示如何将其保存回模型中。
这将从一个未绑定的自定义字段中获取值,进行处理,并将其保存到我的真实描述字段中:
class WidgetForm(forms.ModelForm):
extra_field = forms.CharField(required=False)
def processData(self, input):
# example of error handling
if False:
raise forms.ValidationError('Processing failed!')
return input + " has been processed"
def save(self, commit=True):
extra_field = self.cleaned_data.get('extra_field', None)
# self.description = "my result" note that this does not work
# Get the form instance so I can write to its fields
instance = super(WidgetForm, self).save(commit=commit)
# this writes the processed data to the description field
instance.description = self.processData(extra_field)
if commit:
instance.save()
return instance
class Meta:
model = Widget
fields = "__all__"
如果您绝对只想将组合字段存储在模型上而不是两个单独的字段,则可以执行以下操作:
form
上的属性创建自定义表单ModelAdmin
save_formset
在您的ModelAdmin
(https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model)上解析方法中的自定义字段我从来没有做过这样的事情,所以我不太确定它会如何工作。