【问题标题】:User ModelForm not getting saved in database (Django)用户 ModelForm 未保存在数据库中(Django)
【发布时间】:2020-09-24 21:41:52
【问题描述】:

我有一个创建自定义用户实例的 ModelForm(AbstractUser 模型)。每当我尝试提交表单时,除了重新加载页面(由于操作)之外什么都没有发生,并且没有任何内容保存在数据库中。代码如下:

def sign_up(request):
    if request.method == 'POST':
        print("test")
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
            data = form.cleaned_data
            user = authenticate(
                username=data['username'],
                password=data['password']
            )
            user_login(request, user)
    else:
        form = UserForm()
    return render(request, 'schedules/signup/signup.html', {'form':form})
class ClientUser(AbstractUser):
    classes = models.ManyToManyField(ScheduleClass)
    personal_changes = models.TextField(name="personal_changes", default="none")
    schedule = models.ManyToManyField(Schedule)
    def get_classes(self):
        return self.classes
class UserForm(forms.ModelForm):

    class Meta:
        model = ClientUser
        fields = ['username', 'password', 'classes', 'schedule']
        <form method="post" action="http://127.0.0.1:8000/">
            {% csrf_token %}
            {{ form }}
            <input type="submit">
        </form>

由于某种原因,它甚至没有打印我在 sign_up 函数的第 3 行写的行,即使我发布。是不是我做错了什么?

【问题讨论】:

    标签: python django django-forms django-3.1


    【解决方案1】:

    好的,所以你说你的打印没有显示,所以首先让你的表单动作相对于网站,在这里使用 django 的{% url 模板标签通常是一个好主意,或者只是将其留空以发布到当前网址;

            <form method="post" action="">
                {% csrf_token %}
                {{ form }}
                <input type="submit">
            </form>
    

    现在,如果您使用 POST 请求访问视图并且表单无效,那么当页面再次呈现时,您目前所做的将不会包含任何错误,因此看起来就像什么都没发生一样实际上,您确实尝试过验证表单,只是没有将错误返回给用户。

    调用form.is_valid() 后,如果该form 实例无效,则会将错误添加到该实例中。因此表单实例的状态非常重要,您需要将其传递回给用户,而不是创建一个新的实例,这样才能消除错误。

    你会做这样的事情;

    def sign_up(request):
        # Create the form for a GET request
        form = UserForm()
    
        if request.method == 'POST':
            # Recreate the form instance with the POST data
            form = UserForm(request.POST)
            # Run form validation
            if form.is_valid():
                form.save()
                data = form.cleaned_data
                user = authenticate(
                    username=data['username'],
                    password=data['password']
                )
                user_login(request, user)
    
        # if you end up here on a POST request, the form isn't valid but still contains the errors
        return render(request, 'schedules/signup/signup.html', {'form':form})
    

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多