【问题标题】:ModelForm doesn´t validateModelForm 不验证
【发布时间】:2021-11-24 18:29:54
【问题描述】:

我只是无法让我的模型表单进行验证。我从视图中调用它,并且 GET 正确打印它,但是当 POST 发生时它不会验证。 总是得到

ValueError 异常值:视图 gestionPartesMedicos.views.partes_medicos_add 没有返回 HttpResponse 对象。它返回 None 。

表单的名称属性对应于模型和表单。

---更新---

这是我的模特:

class MedicalList(models.Model):
    worker= models.ForeignKey(worker, on_delete=models.CASCADE)
    description=models.CharField(max_length=255)
    upload=models.FileField(upload_to=user_directory_path, null=False, blank=False)
    created_at=models.DateTimeField(auto_now_add=True)

这是我的表单类:

class MedicalListForm(forms.ModelForm):
    
worker = forms.ModelChoiceField(
    queryset=Worker.objects.none(),
    empty_label=None,
    widget=forms.Select(attrs={'class': 'form-control'})
)
description=forms.CharField(
    widget=forms.Textarea(attrs={'class': 'form-control'})
)
upload=forms.FileField(
    widget=forms.ClearableFileInput(attrs={'class': 'form-control'})
)

class Meta:
    model = MedicalList
    fields = ( 
        'worker',
        'description',
        'upload',
    )

def __init__(self, *args, **kwargs):
    user_id = kwargs.pop('user_id', None)
    super().__init__(*args, **kwargs)
    self.fields['worker'].queryset = Worker.objects.filter(user_id=user_id)

我的观点有问题:

def medical_list_add(request):
    if request.method == "POST":
        form = MedicalListForm(request.POST,request.FILES,user_id=request.user)
        
        if form.is_valid():
            form.save()
            return redirect('medical_list')
    else:
        form = MedicalListForm(user_id=request.user)
        return render(request, 'medical_list_add.html', {'form': form})

模板中的表格:

<form method="POST">
            {% csrf_token %}
                <div class="form-group">                
                    {{ form.as_p }}
                    <button type="submit" class="btn btn-primary">Guardar</button>
                    <a class="nav-item linking" href = "{% url 'medical_list' %}">Cancel</a>
                </div>
            </form>

这是我得到的回复:

请求信息 USER 12345

GET 没有 GET 数据

POST 变量值 csrfmiddlewaretoken
'2zG3amQlZlPsrytMtF91ZiJQDZ679E2Zgrx3YxcOPzcNj6dNCl101Lj0UV96STLY' 工人'14'描述'pm'上传'medical.pdf'

可能在 Model 字段 created_at 附近?只是想猜测,完全迷失了。 提前致谢

【问题讨论】:

  • 什么是workerForeignKeyworker 对象或 Trabajador 对象?
  • 对不起,我刚把它翻译成英文,但错过了,它是工作对象的外键

标签: django django-forms


【解决方案1】:

主要问题是如果表单无效,您的视图不会返回 HTTP 响应。您应该取消缩进 render(…) 调用:

def medical_list_add(request):
    if request.method == "POST":
        form = MedicalListForm(request.POST,request.FILES,user_id=request.user)
        
        if form.is_valid():
            form.save()
            return redirect('medical_list')
    else:
        form = MedicalListForm(user_id=request.user)
    # &downarrow;&downarrow; both for GET and a failed POST
    return render(request, 'medical_list_add.html', {'form': form})

此外,表单字段是在类级别指定的。通过在__init__ 方法中构造一个表单字段,这将不会使用它

class MedicalListForm(forms.ModelForm):
    worker = forms.ModelChoiceField(
        queryset=Trabajador.objects.none(),
        empty_label=None,
        widget=forms.Select(attrs={'class': 'form-control'})
    )
    description=forms.CharField(
        widget=forms.Textarea(attrs={'class': 'form-control'})
    )
    upload=forms.FileField(
        widget=forms.ClearableFileInput(attrs={'class': 'form-control'})
    )
    
    class Meta:
        model = MedicalList
        fields = ( 
            'worker',
            'description',
            'upload',
        )

    def __init__(self, *args, **kwargs):
        user_id = kwargs.pop('user_id', None)
        super().__init__(*args, **kwargs)
        self.fields['worker'].queryset = worker.objects.filter(user_id=user_id)

如果您的表单处理文件,您应该将enctype=… parameter 设置为multipart/form-data

<form method="POST" enctype="multipart/form-data">
    …
</form>

【讨论】:

  • 我想给 POST 和 GET 不同的渲染,所以我尝试按自己的方式进行。你的工作,但让我没有 GET 的上下文或 POST 的上下文;还要加载不同的模板。
  • 那么也许通过在 init 中构造是不验证的原因?仍然没有验证
  • @VidalM.:这意味着它不会使用form-control 作为类。通常,如果您更新视图,HTML 表单现在应该呈现错误,至少如果您使用 {{ form }} 呈现它,或者您添加了表单及其字段的 .errors,如文档中所述:docs.djangoproject.com/en/3.2/topics/forms/…
  • 是的,它现在呈现错误,并且说需要更新字段。但是我不明白如果我必须强制在该逻辑之外放置一个回报,我为什么要在方法之间做出逻辑决定。请原谅我的英语和低编程知识
  • @VidalM.: 该文件是否需要?如果您使用文件,该表单在这种情况下是否有效?
猜你喜欢
  • 2012-09-30
  • 2016-12-20
  • 2018-11-03
  • 2013-11-26
  • 2013-08-22
  • 2011-06-03
  • 2011-01-09
  • 2012-11-03
相关资源
最近更新 更多