Django:只将一个表单字段渲染为可编辑的文本字段,然后再将其作为readonly渲染

时间:2010-11-12 03:42:24

标签: django django-forms rendering

我有典型的个人资料/帐户设置表单。正如预期的那样,您将拥有一个“名称”字段和一个“域”字段(将用作网站URL:maddy.mywebsite.com)。此域字段只能编辑一次。一旦设置为一件事,以后就不会被编辑(因为这就像一个网站网址)。

在模型级别,我正在比较该对象的created_on和modified_on(userprofile)并验证“domain”值的保存。但是在表单级别,如何根据我采取的条件单独自定义该字段的呈现?

注1:我不想将“域”字段移动到注册页面。

注意2:我正在尝试使用普通表单(django.forms)而不是ModelForm。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用两个htmls,一个用于创建配置文件,另一个用于编辑配置文件。如果您使用相同的django,则在创建配置文件中呈现完整表单并编辑配置文件,您可以使用css或javascript禁用#id_name和#id_domain字段。使用js的实现:

    <script type="text/javascript"> 
        var domain = document.getElementById("id_domain");
        var name = document.getElementById("id_name");
        domain.value = "{{ domain }}";
        name.value = "{{ name }}";
        domain.readOnly = true;        
    </script>

答案 1 :(得分:1)

这看起来很棘手,你可以阅读下面的一些想法:

In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?

http://lazypython.blogspot.com/2008/12/building-read-only-field-in-django.html

但这些都不是特别简单,所以我建议(和@dcrodjer一样):

创建两个表单,一个用于创建,一个用于编辑。在编辑表单上,删除“域”字段,这样就不需要/不会保存:

# forms.py

class AddForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('name','domain',)  

class EditForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('name',)  

在您的视图中,创建相应的表单,并在模板中根据您给出的表单呈现不同的HTML:

{% if form.domain %}
    {{form.domain.label_tag}}: {{form.domain}} {{form.domain.errors}}
{% else %}
    Domain: <input type="text" disabled="disabled" value="{{userprofile.domain}}"/>
{% endif %}