【问题标题】:Django does not receive POST method in HTML formDjango 不接收 HTML 表单中的 POST 方法
【发布时间】:2021-02-11 20:04:17
【问题描述】:

HTML 未提交 post 方法(我从 boostrap 工作室制作的模板)。我尝试在 views.py if method.request == 'POST: 中添加打印语句,但它不会通过 if 语句。问题是当我尝试保存表单中的输入时,它不会保存在数据库中。但是,当我尝试在 html(同一文件)中手动编码 <form>..</form> 时,django 会保存数据。以下是我认为与问题有关的代码:

views.py

def profile_settings(request):
user = request.user
data = Profile.objects.get(pk=user.id)
print("AA")
if request.method == 'POST':
    print("AB")
    form = ProfileDisplayForm(request.POST or None, request.FILES or None, instance=data)
    print(request.POST)
    if form.is_valid():
        print(request.POST)
        form.save()
else:
    form = ProfileDisplayForm(instance=data)

context = {'form': form}
return render(request, 'main/profile_edit.html', context)

models.py

class Profile(models.Model):
account = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
age = models.IntegerField(blank=True, null=True, default="Not Set", validators=[MaxValueValidator(100), MinValueValidator(1)])
gender = models.CharField(max_length=6, choices=GENDER_CATEGORY, null=True, default="Not Set")
profile_image = models.ImageField(upload_to=get_profile_image_filepath, default='default.jpg', null=True)

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

forms.py

class ProfileDisplayForm(ModelForm):
age = forms.IntegerField(widget=forms.NumberInput(attrs={'class': 'form-control',}))

class Meta:
    model = Profile
    fields = ('age', 'gender', 'profile_image')

html -->这是我从 bootstrap studio 得到的自定义代码,我认为是导致问题的原因

{% extends 'main/base.html' %}
{% block title %}
Profile Settings
{% endblock %}
{% block content %}
<div class="container profile profile-view" id="profile">
        <div class="row">
            <div class="col-md-12 alert-col relative">
                <div class="alert alert-info absolue center" role="alert">
                    <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
                    <span>Profile save with success</span></div>
            </div>
        </div>
        <form enctype="multipart/form-data" method="post">
            {% csrf_token %}
            <div class="form-row profile-row">
                <div class="col-md-4 relative">
                    <div class="avatar">
                        <div class="avatar-bg center"></div>
                    </div>
            </div>
                <div class="col-md-8">
                    <h1>Profile </h1>
                    <hr>
                    <div class="form-row">
                        <div class="col-sm-12 col-md-6">
                            <div class="form-group"><label>Username:</label><div class="none" style="background-color: white; height: 40px; border-radius: 5px"> <h6 style="padding: 10px;">{{user.username}}</h6></div></div>
                        </div>
                        <div class="col-sm-12 col-md-6">
                            <div class="form-group"><label>Email:</label><div class="none" style="background-color: white; height: 40px; border-radius: 5px"> <h6 style="padding: 10px;">{{user.email}}</h6></div></div>
                        </div>
                    </div>
                    <div class="form-row">
                        <div class="col-sm-12 col-md-6">
                            <div class="form-group"><label>Age </label><input class="form-control" type="number" name="age" value="{{user.profile.age}}"></div>
                        </div>
                        <div class="col-sm-12 col-md-6">
                            <div class="form-group"><label>Gender</label>{{form.ghttps://stackoverflow.com/questions/ask#ender}}</div>
                        </div>
                    </div>
                    <hr>
                    <div class="form-row">
                        <div class="col-md-12 content-right">
                            <button class="btn btn-primary form-btn" type="submit">SAVE </button>
                            <a href="{% url 'home' %}"><button class="btn btn-danger form-btn" type="button">CANCEL </button></a></div>
                    </div>
                </div>
            </div>
        </form>
    </div>
{% endblock %}

【问题讨论】:

    标签: html django


    【解决方案1】:

    尝试在您的 html 文件中使用大写的“POST”,例如

    表单 enctype="multipart/form-data" 方法="POST"

    如果不起作用,请尝试添加 action 属性。

    form enctype="multipart/form-data" method="POST" aciton="{% url 'your_url' %}"

    【讨论】:

    • 不走运。在发布到这里之前,我已经尝试过这些。抱歉,我忘了把它包含在帖子中。
    【解决方案2】:

    您是正确的,因为错误在于您在帖子中添加的自定义 html 代码。

    您可以通过在 request.method == "POST" if 语句中添加打印语句来确认这一点

    在您正在使用的表单内的 HTML 文件中 &lt;h6 style="padding: 10px;"&gt;{{user.username}}&lt;/h6&gt; & &lt;h6 style="padding: 10px;"&gt;{{user.email}}&lt;/h6&gt; 这会导致您在提交表单时忽略这些值。因此,后端只会收到年龄和性别,并导致 form.is_valid() 为 false。


    你能做什么

    您可以使用带有已分配值的输入以及禁用属性,以防您想让它们不可编辑。

    <input type="text" name="username" value="{{user.username}}" disabled/>
    <input type="text" name="email" value="{{user.email}}" disabled/>
    

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 1970-01-01
      • 2014-08-11
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多