Django中的ModelChoiceField

1 投票
1 回答
1250 浏览
提问于 2025-04-18 15:31

我创建了一个Django表单,用来获取用户输入的数据,并在数据库模型中搜索这些数据。不过,我在使用下拉菜单功能时遇到了问题,无法正确显示。我使用了ModelChoiceField,但它显示为空。我在forms.py中有三个字段,是我在数据库中进行搜索的。

models.py

class Release(models.Model):
    number = models.CharField(max_length=50,unique=True)
    notes = models.CharField(max_length=50)
    changes = models.CharField(max_length=50)

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

class Metamodule(models.Model):
    name = models.CharField(max_length=50,unique=True)
    version = models.IntegerField(default=0)
    release = models.ForeignKey(Release,related_name="num")
    createdate = models.DateField(auto_now=True, null=True)
    createdby = models.CharField(max_length=50)

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


class Module(models.Model):
    name = models.CharField(max_length=50,unique=True)
    version = models.IntegerField(default=0)
    metamodule = models.ForeignKey(Metamodule,related_name="metaname")
    createdate = models.DateField(auto_now=True, null=True)
    changes = models.CharField(max_length=50)

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

forms.py

class ModuleForm(forms.Form):
     release_num = forms.ModelChoiceField(queryset=Release.objects.all().values('number'),empty_label='Pick a Release')
     metamodule_name = forms.CharField(max_length=50)
     module_name = forms.CharField(max_length=50)

views.py

from django.shortcuts import render
from search.forms import ModuleForm
from django.http import HttpResponse
from search.models import Module,Metamodule,Release

def searchview(request):
     if request.method == 'GET':
    form = ModuleForm(request.GET)  
    if form.is_valid():
      release_num = form.cleaned_data['release_num']
      metamodule_name = form.cleaned_data['metamodule_name']
      module_name = form.cleaned_data['module_name']
      results = Module.objects.filter(metamodule__release__number=release_num).filter(metamodule__name=metamodule_name).filter(name=module_name)
      return render(request,'search/search_result.html',{'form': form, 'results': results})
     else:
     form = ModuleForm()    
     return render(request, 'search/search_form.html',{'form': form})

search_form.html

<html>
<head>
    <title>Search</title>
</head>
<body>
     {% if error %}
        <p style="color: red;">Please submit a search term.</p>
    {% endif %}
    <form action="/search/" method="get">
        <select name="release_num">
            {% for release_num in release_num %}
            <option value="{{ release_num.number }}">{{ release_num.number }}</option>
            {% endfor %}
    </select>   
    <p><label for="metamodule_name">Metamodule:</label>
    <input type="text" name="metamodule_name">
    <p><label for="module_name">Module:</label>
    <input type="text" name="module_name">
    <input type="submit" value="Search">
    </form>
</body>
</html>

1 个回答

0

在search_form.html文件中试试这个:

 <form action="/search/" method="get">
    {{ form.release_num }}
   {{ form.metamodule_name  }}
   {{ form.module_name }}

撰写回答