首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ModelForm不验证

ModelForm不验证
EN

Stack Overflow用户
提问于 2021-11-24 18:29:54
回答 1查看 53关注 0票数 1

我只是不能让我的模型来验证。我从视图中调用它,并得到正确的打印,但是当POST发生时,它不会验证。万事通

ValueError异常值:视图gestionPartesMedicos.views.partes_medicos_add没有返回HttpResponse对象。它没有归还任何东西。

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

--更新

这是我的模型:

代码语言:javascript
复制
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)

这是我的表格课:

代码语言:javascript
复制
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)

这就是我的观点:

代码语言:javascript
复制
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})

模板中的表格:

代码语言:javascript
复制
<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>

这就是我得到的回应:

请求信息用户12345

不获取数据

POST变量值csrfmiddlewaretoken令牌

'2zG3amQlZlPsrytMtF91ZiJQDZ679E2Zgrx3YxcOPzcNj6dNCl101Lj0UV96STLY‘员工'14’描述下午‘上传'medical.pdf’

它可能在模型字段created_at附近吗?只是想猜一猜,完全迷路了。提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-24 18:38:58

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

代码语言:javascript
复制
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)
    # ↓↓ both for GET and a failed POST
    return render(request, 'medical_list_add.html', {'form': form})

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

代码语言:javascript
复制
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)

如果窗体处理文件,则应将 parameter设置为multipart/form-data

代码语言:javascript
复制
<form method="POST" enctype="multipart/form-data">
    …
</form>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70101246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档