【问题标题】:Django error: didn't return an HttpResponse object. It returned None insteadDjango 错误:没有返回 HttpResponse 对象。它返回 None 而不是
【发布时间】:2020-04-17 19:04:00
【问题描述】:

我有以下表格:

class PrestataireProfilForm(forms.ModelForm):
    class Meta:
        model = Prestataire
        fields = ["user", "name", "address", "phone", "fax", "city"]

    def __init__(self, *args, **kwargs):
        super(PrestataireProfilForm, self).__init__(*args, **kwargs)
        self.fields['city'].widget.attrs.update({'class' : 'custom-select'})
        self.fields['city'].label = ""

这是我的观点:

@login_required
def prestataire_profil(request):
    prestataire = Prestataire.objects.filter(user=request.user).first()
    is_prestataire = request.user.groups.filter(name='Prestataire').exists()
    form = PrestataireProfilForm(request.POST or None, instance=prestataire)
    if request.method == 'POST':
        context = {
            'profil': prestataire,
            'is_prestataire': is_prestataire,
            'form': form
        }
        if form.is_valid():
            prestataire = form.save(commit=False)
            prestataire.save()
            context = {
            'profil': prestataire,
            'is_prestataire': is_prestataire
            }
            # return render(request, 'dashboard/prestataires/profil.html', context)
            return redirect('prestataire_profil')
    else:
        context = {
            'profil': prestataire,
            'is_prestataire': is_prestataire,
            'form': form
        }
        return render(request, 'dashboard/prestataires/profil.html', context)

这是我的 html 表单:

<form method='POST'>
                {% csrf_token %}
                <div class="form-group row">
                  <label for="name" class="col-4 col-form-label">Nom d'utilisateur</label> 
                  <div class="col-8">
                    <input value="{{ profil.user.username }}" id="name" name="name" placeholder="Nom d'utilisateur" class="form-control here" required="required" type="text" disabled>
                  </div>
                </div>
                <div class="form-group row">
                  <label for="name" class="col-4 col-form-label">Nom*</label> 
                  <div class="col-8">
                    <input value="{{ profil.user.last_name }}" id="name" name="name" placeholder="Nom" class="form-control here" required="required" type="text">
                  </div>
                </div>
                <div class="form-group row">
                  <label for="name" class="col-4 col-form-label">Prénom*</label> 
                  <div class="col-8">
                    <input value="{{ profil.user.first_name }}" id="name" name="name" placeholder="Prénom" class="form-control here" required="required" type="text">
                  </div>
                </div>
                <div class="form-group row">
                  <label for="name" class="col-4 col-form-label">Raison sociale*</label> 
                  <div class="col-8">
                    <input value="{{ profil.name }}" id="name" name="name" placeholder="Raison sociale" class="form-control here" required="required" type="text">
                  </div>
                </div>
                <div class="form-group row">
                  <label for="address" class="col-4 col-form-label">Adresse</label> 
                  <div class="col-8">
                    <input value="{{ profil.address }}" id="address" name="address" placeholder="Adresse" class="form-control here" type="text">
                  </div>
                </div>
                <div class="form-group row mb-0">
                  <label for="address" class="col-4 col-form-label">Ville</label> 
                  <div class="col-8">
                    {{ form.city|as_crispy_field }}
                  </div>
                </div>
                <div class="form-group row">
                  <label for="phone" class="col-4 col-form-label">Téléphone</label> 
                  <div class="col-8">
                    <input id="phone" name="phone" placeholder="Téléphone" class="form-control here" type="text">
                  </div>
                </div>
                <div class="form-group row">
                  <label for="fax" class="col-4 col-form-label">Fax</label> 
                  <div class="col-8">
                    <input value="" id="fax" name="fax" placeholder="Fax" class="form-control here" type="text">
                  </div>
                </div>
                <div class="form-group row">
                  <div class="offset-4 col-8">
                    <button name="submit" type="submit" class="btn btn-primary">Update My Profile</button>
                  </div>
                </div>
              </form>

当我点击提交按钮时,它给了我以下错误:

异常类型:ValueError 异常值:视图 dashboard.views.prestataire_profil 未返回 HttpResponse 对象。它返回 None 。

数据没有改变,并且在调试中没有任何信息可以查看问题所在。正如您在视图中看到的,我评论了返回渲染行。我将其更改为返回重定向,但同样的问题! 请帮忙!谢谢。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    致敬!

    我认为您的表格无效(您检查过吗?)。你处理了这个案子if form.is_valid(),但如果不是呢?那你什么都没有退!因此,如果在所有情况下您都将重定向到prestataire_profil,您应该这样做:

    @login_required
    def prestataire_profil(request):
        [...]
        if request.method == 'POST':
            [...]
            if form.is_valid():
                [...] # do your stuff 
                # return redirect('prestataire_profil') <--- wrong indentation
            return redirect('prestataire_profil') # <--- there, it will return something anyway
        else:
            [...]
            return render(request, 'dashboard/prestataires/profil.html', context)
    

    try... except... finally... 语句会更好,因为您所做的方式不会阻止您返回 None 而不是预期的 HttpResponse object

    【讨论】:

    • 在这种情况下如何实现 try catch?如果发生这种情况,喜欢给出错误消息,我如何检查表格是否有效?我不是指代码,我已经使用打印语句检查过,但是如何检查我输入表单的数据是否有效?因为我所做的只是改变一些字符串,没有奇怪的数据没有错误的数据类型
    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2017-01-25
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2016-08-08
    相关资源
    最近更新 更多