python - django 中模型未使用 obj.save() 保存

标签 python django django-2.0

我将此模型作为内置用户模型的扩展:

class userprofile(models.Model):

    phone = models.CharField(max_length=20)
    address = models.CharField(max_length=500)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    @receiver(post_save, sender=User)
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            userprofile.objects.create(user=instance)

    @receiver(post_save, sender=User)
    def save_user_profile(sender, instance, **kwargs):
        instance.userprofile.save()

用于创建这些模型的 django 表单类是:

class UserRegister(forms.Form):

    first_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'First Name'}))
    last_name = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Last Name'}))
    username = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Username'}))
    email = forms.EmailField( required=True, widget=forms.widgets.EmailInput(attrs={'placeholder': 'Email'}))
    password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())
    confirm_password =forms.CharField(required=True, widget=forms.widgets.PasswordInput())

    class Meta:
        model=User
        fields=['first_name','last_name','username','email','password','confirm_password']




   def clean(self):
        cleaned_data = super(UserRegister, self).clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")
        if password != confirm_password:
            raise forms.ValidationError(
                "password and confirm_password does not match"
            )



class UserProfileCreate(forms.Form):
    mobile = forms.CharField(required=True, widget=forms.widgets.NumberInput(attrs={'placeholder': 'Mobile No.'}))
    address = forms.CharField(required=True, widget=forms.widgets.TextInput(attrs={'placeholder': 'Delivery address'}))

    class Meta:
        model= userprofile
        fields=['mobile', 'address']

HTML 如下:

<form class="form-horizontal" method="POST" action="{% url 'createuser' %}">



                            {% csrf_token %}



                           {% for hidden in form.hidden_fields %}
                              {{ hidden }}
                            {% endfor %}

                            {% for field in form.visible_fields %}
                              <div class="form-group">
                                <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                                {{ field|add_class:'form-control' }}
                                {% for error in field.errors %}
                                  <span class="help-block">{{ error }}</span>
                                {% endfor %}
                              </div>
                            {% endfor %}

                            {% for field in formplus.visible_fields %}
                              <div class="form-group">
                                <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                                {{ field|add_class:'form-control' }}
                                {% for error in field.errors %}
                                  <span class="help-block">{{ error }}</span>
                                {% endfor %}
                              </div>
                            {% endfor %}

                            <div class="form-group">
                            <div class="col-md-6 col-md-offset-4">
                                <button type="submit" class="btn btn-primary">
                                    Register
                                </button>
                            </div>
                        </div>
                    </form>

View 如下:

def create(request):
    if request.method == "GET":
        return render(request, 'userextension/usercreate.html', {'form' : UserRegister, 'formplus' : UserProfileCreate , 'message': 'Create your account'})

    else:
        user = UserRegister(request.POST)
        profile= UserProfileCreate(request.POST)
        if user.is_valid():
            if user.save():
                return render(request, 'userextension/usercreate.html', {'form' : UserRegister, 'message': 'Account created successfully'})




        return render(request, 'userextension/usercreate.html', {'form' : UserRegister, 'message': 'Could not create account'})

我在学习了一些 django 教程后做了这件事。我在任何地方都没有看到任何不正确的代码,但我无法将由此提交的表单保存为模型。我没有在views.py中执行userprofile.save(),因为它通过OneToOneField连接到User,并且我已经提到每当创建用户时都会自动创建用户配置文件。

既不会引发任何错误,也不会创建帐户。请大家略读一下好吗?

最佳答案

这里有几个问题。主要的一个是您的用户表单无效。但是您没有将无效表单传递回模板,因此您永远无法了解它无效的原因。您应该传递已经创建的实例,而不是传递类。

return render(request, 'userextension/usercreate.html', {'form' : user, 'message': 'Could not create account'})

第二个问题是您从未对个人资料表单执行任何操作 - 您不会检查它是否有效,也不会保存它。

另请注意,您应该始终在成功发布后重定向。

关于python - django 中模型未使用 obj.save() 保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49951987/

相关文章:

python - Pandas:Groupby 并使用剩余的列名和值创建字典

python - Python 嵌套函数是否可以写入时复制?

python - 如何将整数中的数字相加

django - 中文 django 翻译不起作用

python - 围绕外部数据构建对象模型

python - 使用 PRAW 在标题返回中获取 & 而不是 &

python - 将 Dagster 与 Django 集成

python - 如何过滤 Django2 的 autocomplete_fields 中的选择?

python - Django Wagtail CSV 和照片 "upload"- 管理命令

python - 在 Lastmod 上使用聚合 max 函数时,Django 的站点地图框架给出错误