【问题标题】:Django form is saved but result field is empty in databaseDjango 表单已保存,但数据库中的结果字段为空
【发布时间】:2023-01-08 03:48:13
【问题描述】:

Django 表单已保存,但“结果”字段在数据库中显示为空。 即使从管理面板填充文件后,它也会被保存,但仍然显示为空。

模型.py

class Result(models.Model):

    class Choises(models.TextChoices):
        POSITIVE = "POSITIVE", "Positive"
        NEGATIVE = "NEGATIVE", "Negative"
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50, default=None)
    result = models.CharField(max_length = 100, choices=Choises.choices, blank=False
    )
    resultDoc = models.ImageField(upload_to='testResults', height_field=None, width_field=None,)

    def __str__(self):
        return self.user.username

表格.py

class resultForm(forms.ModelForm):
    class Meta:
        model = Result
        fields = ['name', 'result', 'resultDoc']

视图.py

def inputResult(request, pk):
    user = User.objects.filter(id=pk).first()
    profile = newProfile.objects.filter(user=user).first()
    if profile == None:
        profile = oldProfile.objects.filter(user=user).first()
    rForm = resultForm(request.POST, request.FILES)
    if request.method == 'POST':
        rForm = resultForm(request.POST, request.FILES)
        if rForm.is_valid():
            order = rForm.save(commit=False)
            order.user_id = pk
            order.save()
            return redirect('stored_records')
    else:
        rForm = resultForm()
    context = {'user' : user, 'profile':profile, 'rForm': rForm}
    return render(request, 'Testing booth End/input-result-customer-info.html', context)

输入结果客户信息.html

      <form action="" method = "POST" enctype= "multipart/form-data">
        {% csrf_token %}
        <div class="mb-3">
            <label for="name" class="form-label">Name</label>
            <input type="text" class="form-control" id="name" name="name" placeholder="Uploaded By/Doctor Name">
        </div>
        <div class="mb-3">
          <label for="result" class="form-label">Result</label>
          

          <select class="form-select" id="result"  name="result" class="form-control">
              <option value="POSITIVE">Positive</option>
              <option value="NEGATIVE">Negative</option>
          </select>
        </div>
        <div class="mb-3">
          <label>Upload Scan File</label>
          <div class="upload d-flex justify-content-between">
              <div class="file-placeholder">Upload Scan File</div>
              <input type="file" class="form-control d-none" id="resultDoc" name="resultDoc" >
              <label for="resultDoc" class="form-label cam-img"> <img src="{% static 'user/images/Camera.png' %}">  </label>
          </div>
      </div>
        <button class="btn btn-primary w-50 ms-auto d-block h-100" type="submit">Upload</button>
      </form>

enter image description here

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    我认为这不起作用的原因是您在后端创建了一个表单 (rForm),但您没有在前端使用它。 这是你应该如何在前端呈现你的表单:

    <form method="post">
        {{ rForm.as_p }} # This is the easiest possible implementation
        <button type="submit">Submit</button>
    </form>
    

    如果您想控制表单的呈现方式,那么您必须确保输入字段以后端期望的方式命名。您可以完全手动或半手动完成,但您的字段名称必须正确设置,否则将无法正常工作。

    典型方法的示例,假设您有多个相似的文本输入

    {% for field in rForm %}
        <label for="{{ field.auto_id }}">{{ field.name }}</label>
        <input type="text" name="{{ field.html_name }}" id="{{ field.auto_id }}" />
    {% endfor %}
    

    完全动手方法的示例

    <select class="form-select" id="{{ rForm.result.auto_id }}"  name="{{ rForm.result.html_name }}" class="form-control">
        <option value="POSITIVE">Positive</option>
        <option value="NEGATIVE">Negative</option>
    </select>
    

    为了确保输入被正确解析,在你的视图中添加一个打印语句来打印 POST 请求:

    print("Post Request : ", request.POST) 
    

    从那里您将能够看到结果字段是否被正确拾取或者是否被忽略。通常,字段被忽略是因为它们没有正确命名,有时是因为它们未通过验证。

    如果其余数据都正确保存并且只有 result 被遗漏,那么几乎可以肯定字段名称存在问题,因为如果表单验证失败,它将中止整个操作。

    附言我刚刚注意到您选择输入的 class 属性声明了两次

    【讨论】:

      猜你喜欢
      • 2022-07-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2014-04-14
      • 2018-01-05
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多