Python Django 表单 多选 HTML 输出

2 投票
1 回答
1437 浏览
提问于 2025-04-16 07:32

我想在Django表单中输出我模型里的描述字段,但一直没成功。

我搜索了很久也没找到需要的答案,希望能在这里问问。

下面是我的模型、表单、模板和模板输出的内容。我把内容简化了一下,以便让这个帖子更简洁。

我正在这个项目中处理视图部分,所以模型是别人设计的,我也没法去改动它。

模型:

1)

from django.db import models  

class Project(models.Model):  
    description = models.TextField(blank = True)  
    name = models.CharField(max_length = 255, blank = True)  

     def __unicode__(self):
        """ String representation of projects. """
        return unicode(self.name)

2)

from django.db import models

class Share(models.Model):

    description = models.TextField    
    last_access = models.DateTimeField(auto_now = True)
    location = models.URLField(verify_exists = False)
    project = models.ForeignKey('Project', related_name = 'shares')

    def __unicode__(self):
        return unicode(self.location)

表单:

from django import forms
from models import Share

class ExportForm(forms.Form):  
    ps = forms.ModelMultipleChoiceField(queryset=Share.objects.filter(project=1),widget=forms.SelectMultiple())

视图:

form = ExportForm()

模板:

我有这个代码来输出多个选择框:

{{ form.ps }}

模板输出:

<select multiple="multiple" name="ps" id="id_ps">  
<option value="11">Share object </option>  
<option value="10">Share object </option>
</select>

我尝试了很多方法,但似乎无法把“描述”字段放进去,而是显示了“共享对象”。

任何建议都非常感谢。

谢谢!

1 个回答

1

最简单的方法是修改Share模型中的__unicode__方法,让它返回描述信息而不是位置。不过,因为你说不能改动这个模型,所以你需要创建一个新的类,继承ModelMultipleChoiceField,并重写label_from_instance这个方法。

class MyModelMultipleChoiceField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return obj.description

这个内容在文档中有详细说明

撰写回答