1

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

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 行写的行,即使我发布。有什么我做错了吗?

4

1 回答 1

1

好的,所以你说你的打印没有显示,所以首先让你的表单动作相对于网站,{% url在这里使用 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})
于 2020-09-24T21:57:12.737 回答