在Django中,如何在第一次加载表单时才能读取字段?

时间:2010-10-25 20:56:23

标签: django forms readonly

我有模型表单,我需要将其中一个字段读取,直到保存完毕。我还没有找到一个很好的方法来做到这一点,下面就是我在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

2 个答案:

答案 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将输入字段设置为只读。此时您应该能够修改表单类。