2011-04-22 31 views
1

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

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

例如,我有一个跟踪系统的系统模型(我们安装灌溉系统)。系统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) 

是否有更简单的方式来做到这或会变成这样是最好的?

感谢

+0

SystemForm类实际上是所有这些的关键部分。 btw,http://www.python.org/dev/peps/pep-0008/ – 2011-04-22 21:15:17

+0

除了已发布的只读想法之外,您可以访问{{form.instance.pk}}表单上的实例等。 – 2011-04-22 21:16:46

+0

@ skyl - 感谢提示,我以前一直在使用form.instance方法。 – Garfonzo 2011-04-22 22:41:18

回答

1

为了使只读可以将小部件只读属性设置为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 

或在表单的类元使用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> 
+0

这很好,谢谢! – Garfonzo 2011-04-22 22:39:13