【问题标题】:Django Database Not Retrieving The Values Of Drop Down Field's From Site Form?Django 数据库没有从站点表单中检索下拉字段的值?
【发布时间】:2020-06-23 09:31:35
【问题描述】:

所以我基本上在我的网站上有一个表格。表单字段只是下拉字段。没有文本字段等。 一旦用户填写表单并单击提交,用户选择的下拉 values 将在我的命令提示符中正确打印,因为我希望它们会出现,因为我首先在 cmd 中打印它们,以确保我真的得到了用户通过表单输入的输出。该表单有 5 个下拉字段。该表单在用户的个人资料页面中显示给用户。

现在的问题是我在 models.py 文件中创建了一个模型,它在 Django 数据库中创建了与站点中的表单相同的下拉列表。这样我就可以记录谁选择了哪个选项。数据库模型中也有 5 个下拉菜单。但是当我单击数据库中的对象模型时,它会显示下拉列表,但它们的默认值不是用户通过站点表单提交的值。它们的默认值只是“----”,如果我点击下拉菜单,我也会看到其他选项,但它们的默认值只是“----”。它应该是用户通过表单选择的内容。虽然我在命令提示符中正确获取了值,但在数据库中没有。

我已经尝试了下面的代码。我搜索了很多地方,但找不到答案。

Profile.py

<form method="POST">
    {% csrf_token %}
    <section id="questionContent">

        Have you completed the first file today?
        <select id="namazOptions1" name="File1">
            <option value="No">No</option>
            <option value="Yes">Yes</option>
            <option value="N/A">N/A</option>
        </select>
        <br><br>
        Have you completed the second file today?
        <select id="namazOptions2" name="File2">
            <option value="No">No</option>
            <option value="Yes">Yes</option>
            <option value="N/A">N/A</option>
        </select>
        <br><br>
        Have you completed the third file today?
        <select id="namazOptions3" name="File3">
            <option value="No">No</option>
            <option value="Yes">Yes</option>
            <option value="N/A">N/A</option>
        </select>
        <br><br>
        Have you completed the fourth file today?
        <select id="namazOptions4" name="File4">
            <option value="No">No</option>
            <option value="Yes">Yes</option>
            <option value="N/A">N/A</option>
        </select>
        <br><br>
        Have you completed the fifth file today?
        <select id="namazOptions5" name="File5">
            <option value="No">No</option>
            <option value="Yes">Yes</option>
            <option value="N/A">N/A</option>
        </select>
        <br><br>

        <a href="" id="submit">Submit</button>
    </section>

</form>

Views.py

from .models import FileForm

def profile(request):

if request.method == "POST":
    File1 = request.POST.get("File1")
    File2 = request.POST.get("File2")
    File3 = request.POST.get("File3")
    File4 = request.POST.get("File4")
    File5 = request.POST.get("File5")

    print(File1, File2, File3, File4, File5)

    ins = FileForm(File1=File1, File2=File2,
                   File3=File3, File4=File4, File5=File5)

    ins.save()

return render(request, 'profile.html')

Models.py

from django.db import models

# Create your models here.


class FileForm(models.Model):
    CHOICES = (
        ('no', 'NO'),
        ('yes', 'YES'),
        ('n/a', 'N/A'),
    )

    File1 = models.CharField(max_length=6, choices=CHOICES)
    File2 = models.CharField(max_length=6, choices=CHOICES)
    File3 = models.CharField(max_length=6, choices=CHOICES)
    File4 = models.CharField(max_length=6, choices=CHOICES)
    File5 = models.CharField(max_length=6, choices=CHOICES)

所以在数据库中,下拉菜单没有显示默认值,如下所示:

感谢您的帮助

【问题讨论】:

  • 尝试使用FileForm.objects.create (File1=File1 ...) 而不是ins = FileForm(File1=File1, File2=File2, File3=File3, File4=File4, File5=File5 ins.save()
  • 这没有帮助。它做同样的事情。
  • 你能用&lt;button type="submit " name="form" &gt;Submit &lt;\button&gt;替换提交吗?在views.py中你做逻辑之前和if request.method == "POST":之后你检查if 'form' in request.POST:
  • 但这不应该有任何不同。我也试过了
  • 尝试将 html 值更改为 no , yes , n/a 以便它与模型中的值匹配 .. fitt 大写字母

标签: python html django


【解决方案1】:

您也可以使用 django 模型表单来解决问题。 您的 models.py 可能如下所示

from django.db import models

# Create your models here.
class FileModel(models.Model):
    CHOICES = (
        ('no', 'NO'),
        ('yes', 'YES'),
        ('n/a', 'N/A'),
    )

    File1 = models.CharField(max_length=6, choices=CHOICES)
    File2 = models.CharField(max_length=6, choices=CHOICES)
    File3 = models.CharField(max_length=6, choices=CHOICES)
    File4 = models.CharField(max_length=6, choices=CHOICES)
    File5 = models.CharField(max_length=6, choices=CHOICES)

你将创建一个像这样的 django 模型表单

from .models import FileModel
from django import forms

class FileModelForm(forms.ModelForm):
    class Meta:
        model = FileModel
        fields = ['File1','File2','File3','File4','File5']

你的视图看起来像这样

from django.shortcuts import render
from .forms import FileModelForm
from .models import FileModel

def profile(request):

    if request.method == 'POST':
        form = FileModelForm(data=request.POST)

        if form.is_valid():
            form.save()
        return render(request,'profile.html')
    else:
        form = FileModelForm()
        return render(request,'profile.html',{'form':form})


最后你的模板看起来像这样

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AKoa</title>
</head>
<body>
    <h1>Forms</h1>
    <form method="post">
        {% csrf_token %}
        {{form.as_p}}
        <input type="submit" value="save"/>
    </form>
</body>
</html>

【讨论】:

    【解决方案2】:

    在您的 models.py 中,您已设置如果值为 'no',它将显示 'NO',但在您的模板中您传递的是 'No',这不是您的模型所期望的值,因此修复将将您的模板值更改为全部小写:

    <option value="no">
    <option value="yes">
    <option value="n/a">
    

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      相关资源
      最近更新 更多