【问题标题】:Django UpdateView Profile-Save-Data-No-WorkDjango UpdateView Profile-Save-Data-No-Work
【发布时间】:2018-02-14 20:01:47
【问题描述】:

大家好。我是 django 的新手并尽力而为,但此时我陷入困境并需要一些帮助。 问题是:我无法通过模板更新我的用户配置文件。当我进行一些更改时 --- 在控制台中我可以看到 POST,然后我通过“success_url”获得重定向。未显示错误。但未保存新数据。 django 1.11.4

这里是我的代码:

型号:

class Profile(models.Model):
user       = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(blank=True)
location = models.CharField(max_length=30, blank=True)
bio        = models.TextField(max_length=500, blank=True)
active     = models.BooleanField(default=True)
timestamp  = models.DateTimeField(auto_now_add=True)

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

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

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

观看次数:

class RegisterView(CreateView):
    template_name = "registration/register.html"
    form_class = RegisterForm
    success_url = '/'

    def dispatch(self, *args, **kwargs):
        # if self.request.user.is_authenticated():
        #     return redirect("/logout")
        return super(RegisterView, self).dispatch(*args, **kwargs)


class ProfileUpdateView(UpdateView):
    model = Profile
    form_class = ProfileForm
    template_name = 'profiles/profile-detail-update.html'
    success_url = '/'

    def get_object(self, **kwargs):
        username = self.kwargs.get("username")
        if username is None:
            raise Http404
        return get_object_or_404(User, username__iexact=username)

表格

class RegisterForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('username',)

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        user = super(RegisterForm, self).save(commit=True)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

class ProfileForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = ('avatar', 'location', 'bio', 'active',)

网址

url(r'^(?P<username>[\w-]+)/$', ProfileUpdateView.as_view(), name='update'),

模板:

{% extends 'base.html' %}

{% block content %}
    <p>name: {{ user.username }}</p>
    <p>location: {{ user.profile.location }}</p>
    {% if user.profile.avatar %}
        <img style="width: 200px" src="{{ user.profile.avatar.url }}"/>
    {% endif %}
<hr/>
    {% include 'snippets/form.html' %}
{% endblock %}

包括sn-p:

<div class="form pt-2">
{% if form.errors.non_field_errors %}
    {{ form.errors.non_field_errors }}
{% endif %}
    <form method='POST' action='' enctype='multipart/form-data'> {% csrf_token %}
                {{ form.as_p }}
    <button class='btn btn-success' type='submit'>Save</button>
    <button onclick="window.history.back();" class="btn btn-danger" type="button">Go back</button>
    </form>
</div>

求救。

【问题讨论】:

    标签: django django-class-based-views


    【解决方案1】:

    在您的ProfileUpdateView 中,您将User 实例传递给表单,而不是Profile 实例:

    class ProfileUpdateView(UpdateView):
        # ...
    
        def get_object(self, **kwargs):
            username = self.kwargs.get("username")
            if username is None:
                raise Http404
            return get_object_or_404(Profile, user__username__iexact=username)
    

    【讨论】:

    • 很高兴听到它。那么如何在此代码中传递 Profile 实例?
    • 我更新了您的退货声明:return get_object_or_404(Profile, user__username__iexact=username) 这应该传递配置文件实例而不是用户。在您返回的代码中:return get_object_or_404(User, username__iexact=username)
    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2018-11-03
    • 2017-07-27
    • 1970-01-01
    • 2021-11-17
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多