Django和用户输入数据

时间:2011-04-22 20:19:00

标签: django django-models

我正在构建一个Web应用程序,供公司用于执行日常操作。比如发送发票,跟踪应收账款,跟踪库存(以及产品)。我在各种应用程序中设置了几个模型来处理Web应用程序的不同部分。我还将设置权限,以便管理员可以编辑比办公室助理更多的字段。

这让我想到了我的问题。如何显示模型的所有字段,并且有一些可以编辑的字段和一些无法编辑的字段,并且仍然保存模型实例?

例如,我有一个跟踪系统的系统模型(我们安装灌溉系统)。系统ID是主键,对用户来说很重要。但是,它们无法更改该ID,因为它会使事情变得混乱。现在,我有一个使用“form.as_table”通过表单显示我的模型的视图。这是有效的,但仅仅吐出所有模型字段,输入字段填充为该模型实例存储的值。这包括不应编辑的systemID字段。

因为我不希望用户编辑systemID字段,所以我尝试将其作为html表单中的标签,但django抱怨。这是一些代码:

我的模型(不是全部,而是一些):

class System(models.Model):

systemID = models.CharField(max_length=10, primary_key=True, verbose_name = 'System ID')
systemOwner = models.ForeignKey (System_Owner)
installDate = models.DateField()
projectManager = models.ForeignKey(Employee, blank=True, null=True)

#more fields....

然后,我对特定模型实例的看法:

def system_details(request, systemID):
if request.method == 'POST':
    sysEdit = System.objects.get(pk=systemID)
    form = System_Form(request.POST, instance=sysEdit)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/systems/')
else:
    sysView = System.objects.get(pk=systemID)
    form = System_Form(instance=sysView)

return render_to_response('pages/systems/system_details.html', {'form': form}, context_instance=RequestContext(request))

现在显示表单的html页面:

<form action="" method="POST">
{% csrf_token %}
<table>
  {{ form.as_table }}
</table>
<input type="submit" value="Save Changes">
<input type="button" value="Cancel Changes" onclick="window.location.href='/systems/'">
</form>

所以,我想要做的是为html提供两个函数。一种是仅显示用户可以编辑的字段的表单,另一种是仅显示字段内容(systemID)的表单。然后,在视图中,当我想保存用户所做的更改时,我会这样做:

sysValues = System.objects.get(pk=SystemID)
form.save(commit = false)
form.pk = sysValues.sysValues.pk (or whatever the code is to assign the sysValues.pk to form.pk)

有更简单的方法可以做到这一点还是最好的?

由于

2 个答案:

答案 0 :(得分:2)

您可以做的一件事是在表单中排除您不需要的字段:

class System_Form(forms.ModelForm):
    class Meta:
        exclude = ('systemID',)

另一种是使用只读字段:http://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields作为@DTing suggessted

答案 1 :(得分:1)

要使字段只读,您可以将窗口小部件readonly属性设置为True。

使用您的示例:

class System_Form(ModelForm):
    def __init__(self, *args, **kwargs):
        super(System_Form, self).__init__(*args, **kwargs)
        self.fields['systemID'].widget.attrs['readonly'] = True

    class Meta:
        model = System

或使用表单Meta中的excludefields排除字段,并在需要时将其显示在模板中,如下所示:

forms.py

class System_Form(ModelForms):
    class Meta:
        model = System
        exclude = ('systemID',)

views.py

def some_view(request, system_id):
    system = System.objects.get(pk=system_id)

    if request.method == 'POST':
        form = System_Form(request.POST, instance=system)
        if form.is_valid():
            form.save()
            return HttpResponse('Success')
    else:
        form = System_Form(instance=system)
    context = { 'system':system,
                'form':form, }
    return render_to_response('some_template.html', context,
        context_instance=RequestContext(request))

some_template.html

<p>make changes for {{ system }} with ID {{ system.systemID }}</p>
<form method='post'>
    {{ form.as_p }}
    <input type='submit' value='Submit'>
</form>