我有模型表单,我需要将其中一个字段读取,直到保存完毕。我还没有找到一个很好的方法来做到这一点,下面就是我在admin.py中的内容。
class RequestForm(forms.ModelForm):
trac = forms.URLField(min_length=400, required=False)
impacted_users = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple)
formfield_overrides = {
}
class Meta:
model = Request
class RequestAdmin(admin.ModelAdmin):
form = RequestForm
list_display = ['id', 'title', 'priority', 'requestor', 'status']
list_filter = ['requestor', 'priority', 'impacted_users']
actions = [complete]
class Media:
js = (
'/media/js/jquery.js',
'/media/js/hide.js',
)
def save_model(self, request, obj, form, change):
instance = form.save(commit=False)
instance.requestor = request.user
instance.save()
form.save_m2m()
return instance
答案 0 :(得分:1)
我们说有问题的字段是special_field
。
以下是你如何做到的(来自this related answer):
class RequestForm(forms.ModelForm):
trac = forms.URLField(min_length=400, required=False)
impacted_users = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple)
formfield_overrides = {
}
def __init__(self, special_field_starting_value=None, *args, **kwargs):
super(RequestForm,self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if not (instance and instance.id):
self.fields['special_field'].widget.attrs['readonly'] = True
self.fields['special_field'].initial = special_field_starting_value
class Meta:
model = Request
这将在管理员和普通视图中都有效。
完全披露:实际上,我还没有测试过,但假设我链接的答案仍然有效,那么我根据此编写的代码也应该有效。
答案 1 :(得分:0)
这必须在控制器中完成(在Django中称为View)。
在处理表单的视图中,检查以下行:
if request.method == 'POST':
...
else:
...
这应该看起来像official documentation的视图。 (还应该检查form.is_valid()
的第一部分中是否if
。
只要不是用户第一次加载表单(即无效条目),就会执行此逻辑块的第一部分。第二部分else
是第一次加载表单时发生的情况。
您可以检查以在此逻辑块的相应部分中操作表单窗口小部件。 请参阅this post将输入字段设置为只读。此时您应该能够修改表单类。