Django ModelForm不显示所有字段

时间:2018-01-17 04:35:02

标签: python django postgresql django-forms django-views

我正在尝试使用Django ModelForms构建链接到PostgreSQL数据库的表单。模板渲染了两个字段(具有ManyToMany关系的字段),但它只为我提供了一个“标题”的空框。

这是我的forms.py:

Forms.py:

class ProgramForm(forms.ModelForm):
class Meta:
    model = Program
    fields = ['function','task', 'title']
widgets = {
    'function' : forms.Select,
    'task' : forms.Select,
    'title' : forms.Select,
    }

这是我的Models.py:

class Program(models.Model):
    title = models.CharField(max_length=255)
    function = models.ManyToManyField(function, related_name='programs')
    task = models.ManyToManyField(Task, related_name='programs')

    def __unicode__(self):
        return self.title

class Task(models.Model):
    tasknum = models.CharField(max_length=20)
    taskname = models.CharField(max_length=100)
    task_num_name = models.CharField(max_length=100)
    function = models.ForeignKey(Function, related_name="tasks")

    def __unicode__(self):
        return self.task_num_name

class Function(models.Model):
    function = models.CharField(max_length=50)
    function_abrev = models.CharField(max_length = 25)

    def __unicode__(self):
        return self.function

Views.py:

def main(request):
    return render (request, 'assignments/main.html')

def add_program(request):
    form = ProgramForm()
    return render (request, 'assignments/ad_form.html', {"form":form})

def link(request):
    if request.method == 'POST':
        form = ProgramForm(request.POST)
        if form.is_valid():
        return HttpResponse("we maybe getting somewhere") 
    else: 
        return HttpResponse("keep working")

我需要做一些事情:

  1. 我需要在html页面中呈现“标题”作为向下滚动(与“功能”和“任务”相同的方式出现。

  2. 我需要能够保存关系。除了关系之外,模型中包含所需的所有信息。目标是让一名工作人员能够选择一个“功能”,为该选项充当“任务”向下滚动的过滤器(功能和任务有一个OneToMany),然后允许他们选择任何程序他们想要加入他们的投资组合。

  3. 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

<强> 1。表格中的标题字段

为此,我不太清楚标题字段如何向下滚动,就像功能和任务一样。函数和任务是下拉的,因为它们是链接到其他模型的许多字段,这意味着用户必须选择函数模型中的哪些其他对象和任务模型进行链接。另一方面,标题字段只是一个CharField,因此没有一组定义的东西供用户选择。要允许用户输入本程序的标题,您应该将标题的小部件更改为Textarea():

<强> forms.py

from django.forms import ModelForm, Textarea

class ProgramForm(forms.ModelForm):
    class Meta:
        model = Program
        fields = ['function','task', 'title']
    widgets = {
        'function' : forms.Select,
        'task' : forms.Select,
        'title' : Textarea(),
    }

<强> 2。从表单中保存程序

要保存用户在工作人员上创建的程序,只需将form.save()添加到您的链接(请求)功能:

<强> views.py

def link(request):
    if request.method == 'POST':
        form = ProgramForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponse("we maybe getting somewhere") 
        else: 
            return HttpResponse("keep working")

希望这有帮助!

答案 1 :(得分:0)

我能够从views.py进行查询并将if传递给模板。

Views.py 

def function_page(request, Function_id):
assignments = Function.objects.get(id=Function_id)
programs = assignments.programs.all()
context = {
   'assignments': assignments,
   'programs' : programs
}
return render (request, 'function.html', context)

HTML

 {% for program in programs %}
      <option value="{{program.title}}">{{program.title}}</option>
      {% endfor %}