Python Django CBV UpdateView未将表单保存到数据库。(Django 2.0)

Python Django CBV UpdateView未将表单保存到数据库。(Django 2.0),python,django,Python,Django,我是Django的新手,目前正在做一个兼职项目。 我有两个模型的用户和配置文件有一对一的关系 我已经创建了post_save signal,所以当一个新用户注册时,他的空配置文件实例已经在数据库中创建 def create_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) post_save.connect(create_prof

我是Django的新手,目前正在做一个兼职项目。 我有两个模型的用户和配置文件有一对一的关系

我已经创建了post_save signal,所以当一个新用户注册时,他的空配置文件实例已经在数据库中创建

def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

post_save.connect(create_profile, sender=CustomUser)
既然已经创建了概要文件,我想为什么不跳过CreateView并使用UpdateView保存概要文件表单呢

通过这样做,我只需要为概要文件创建一个表单。所以我只有一个视图是UpdateView

当用户创建他的帐户时,他会被引导到配置文件(自动创建)表单,在那里他保存(更新)他的信息

现在,当我提交表单时,在updateView模板中,没有任何内容保存在数据库中,但是表单通过管理面板成功保存,并且由于它是一个更新表单,因此字段也从数据库中正确填充。 我认为问题在于发布数据,因为从admin保存时字段显示正确的数据

有什么问题吗

查看

class ProfileSettingsView(UpdateView):
    model = Profile
    form_class = ProfileSettingsForm
    pk_url_kwarg = 'pk'
    context_object_name = 'object'
    template_name = 'profile_settings.html'

    def get_object(self):
        pk = self.kwargs.get('pk')
        return get_object_or_404(Profile, id=pk)

    def get_context_data(self, **kwargs):
        c_object = self.get_object()
        context = super(ProfileSettingsView, 
        self).get_context_data(**kwargs)

        context['linked_in'] = c_object.linked_in
        context['facebook'] = c_object.facebook
        print('context: ', context)
        return context
模板

<form style="padding-left: 15px; padding-right:15px;" method="POST">
    {% csrf_token %}

    <h3>Basic Information</h3>

    <div class="col-lg-6">
        <div class="form-group">
            <div class="field">
                <label>Facebook<span class="red-txt">*</span></label>
                <input class="form-control" type="text" name="facebook" value="{{ facebook }}" maxlength="60" size="50">
            </div>
        </div>
    </div>

    <div class="col-lg-6">
        <div class="form-group">
            <div class="field">
                <label>Linked In<span class="red-txt">*</span></label>
                <input class="form-control" type="text" name="linked_in" value="{{ linked_in }}" maxlength="60" size="50">
            </div>
        </div>
    </div>

    <div style="padding-bottom:30px; text-align:center;" class="login login-button">
        {# <a href="" class="btn btn-outline-primary btn-lg"></a> #}
        <input type="submit" class="btn btn-outline-primary btn-lg" value="Save Profile">
    </div>
</form>
表格

class ProfileSettingsForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = '__all__'

您已经复制了表单、视图和模板的许多功能,这样做您就绕过了可能会告诉您错误所在的内容

您遇到的具体问题是您的表单无效。这是因为您已将其定义为期望配置文件模型上的所有三个字段,但您没有在提交的数据中提供用户。您在页面上看不到这一点,因为您没有显示表单提供给您的错误,也没有重新显示输入的数据。这两件事都是Django为您完成的,但是您可以通过在HTML中硬编码字段来避免它们

此外,大多数视图代码都是无关的。您的视图应仅如下所示:

class ProfileSettingsView(UpdateView):
    model = Profile
    form_class = ProfileSettingsForm
    template_name = 'profile_settings.html'
因为所有的方法和其他属性都是不必要的。您的表格应为:

class ProfileSettingsForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = ['linked_in', 'facebook']
        widgets = {
            'linked_in': forms.TextInput({'class': 'form-control'}),
            'facebook': forms.TextInput({'class': 'form-control'}),
        }
现在,您的模板可以是:

<form style="padding-left: 15px; padding-right:15px;" method="POST">

    {{ form.errors }}

    {% csrf_token %}

    <h3>Basic Information</h3>

    <div class="col-lg-6">
        <div class="form-group">
            <div class="field">
                <label>Facebook<span class="red-txt">*</span></label>
                {{ form.facebook }}
            </div>
        </div>
    </div>

    <div class="col-lg-6">
        <div class="form-group">
            <div class="field">
                <label>Linked In<span class="red-txt">*</span></label>
                {{ form.linked_in }}
            </div>
        </div>
    </div>

    <div style="padding-bottom:30px; text-align:center;" class="login login-button">
        {# <a href="" class="btn btn-outline-primary btn-lg"></a> #}
        <input type="submit" class="btn btn-outline-primary btn-lg" value="Save Profile">
    </div>
</form>

{{form.errors}}
{%csrf_令牌%}
基本信息
脸谱网*
{{form.facebook}
联系在一起*
{{form.linked_in}
{#  #}

显示ProfileSettingsForm的代码。@DanielRoseman补充道。该模型不可能是真正的代码;您可以使用
user=instance
创建配置文件,但不显示用户字段。你需要展示完整的模型。并准确解释当你点击表单上的提交时会发生什么;你会在哪里结束?你看到了什么?@DanielRoseman由于用户和个人资料创建工作正常,我想跳过与此相关的字段。无论如何,我添加了字段。当我点击提交时,页面会重新加载并显示保存在数据库中的字段中的数据。什么?但你问题的关键是,这些信息并没有保存在数据库中。
<form style="padding-left: 15px; padding-right:15px;" method="POST">

    {{ form.errors }}

    {% csrf_token %}

    <h3>Basic Information</h3>

    <div class="col-lg-6">
        <div class="form-group">
            <div class="field">
                <label>Facebook<span class="red-txt">*</span></label>
                {{ form.facebook }}
            </div>
        </div>
    </div>

    <div class="col-lg-6">
        <div class="form-group">
            <div class="field">
                <label>Linked In<span class="red-txt">*</span></label>
                {{ form.linked_in }}
            </div>
        </div>
    </div>

    <div style="padding-bottom:30px; text-align:center;" class="login login-button">
        {# <a href="" class="btn btn-outline-primary btn-lg"></a> #}
        <input type="submit" class="btn btn-outline-primary btn-lg" value="Save Profile">
    </div>
</form>