【问题标题】:Django ModelForm not displaying all fieldsDjango ModelForm 不显示所有字段
【发布时间】:2018-06-25 21:28:24
【问题描述】:

我正在尝试使用 Django ModelForms 构建链接到 PostgreSQL 数据库的表单。该模板正在呈现两个字段(具有多对多关系的字段),但它只给了我一个“标题”的空框。

这是我的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),然后允许他们选择他们的任何程序想添加到他们的投资组合中。

任何帮助将不胜感激。

【问题讨论】:

  • Task 和 Function 模型有缩进问题 - 这是写这个问题的错误吗?
  • 复制/粘贴代码时出错。我会努力解决的。

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


【解决方案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")

希望这会有所帮助!

【讨论】:

  • 此外,OP 也许应该考虑更改小部件或完全摆脱Meta.widgets。字段的默认小部件几乎肯定会更好。
  • 我需要向下滚动标题的原因是因为 Program 模型有大约 300 个程序,我需要用户选择他们想要的程序。有没有办法通过向下滚动而不是手动输入程序来完成这项工作?
  • @dev_2018 要做到这一点,您可以使用标题字段上的选择参数来指定标题值应该来自的标题列表。文档在这里解释:docs.djangoproject.com/en/2.0/ref/models/fields/#choices
  • 如果您只有少数选择,则选择参数似乎很实用。我有 300 多个程序。
  • 您可以做的是将选项列表放在一个单独的 py 文件中,然后导入列表以对其进行划分。但是,如果您想限制它们从一组 300 个标题中进行选择,那么无论您采用哪种方法,都必须在某个地方列出标题。标题是否以编程方式生成?
【解决方案2】:

我能够从 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 %}

【讨论】:

    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多