【问题标题】:Multiple instance in one Django form for editing profile model objects一个 Django 表单中的多个实例,用于编辑配置文件模型对象
【发布时间】:2019-06-09 08:32:13
【问题描述】:

我使用 profile 方法来自定义用户模型。我还使用this 站点创建注册 可以同时创建用户和配置文件的表单。

现在我想写edite_user查看。在这个question我也发现必须使用modelformset_factory 为这个目标创建edit_view。

这是我的文件:

#models.py 
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500)
    degree = models.CharField()

#forms 
class SignUpAdminForm(UserCreationForm):
    bio = forms.CharField(widget=forms.Textarea)
    degree = forms.CharField()
    #Also_their_is_another_fields_here
    class Meta:
        model = User
        fields = (
            'username',
            'email',
            'password1',
            'password2',
            'bio',
            'degree',
        )
#Views.py
def add_user(request):
    if request.method == 'POST':
        form = SignUpAdminForm(request.POST)
        if form.is_valid():
            user = form.save()
            user.refresh_from_db()
            user.profile.bio = form.cleaned_data['bio']
            user.profile.bio = form.cleaned_data['degree']
            user.save()
            return redirect('view_user')
    else:
        form = SignUpAdminForm()
    template = 'add_user.html'
    context = {'form': form}
    return render(request, template, context)

def edit_user(request, id):
    user = get_object_or_404(User, id=id)
    if request.method == "POST":
        UserFormSet = modelformset_factory(user, form=SignUpAdminForm)
        if UserFormSet.is_valid():
            edit_user = UserFormSet.save(commit=False)
            edit_user.save()
            return redirect('view_user')
    else:
        UserFormSet = modelformset_factory(User, form=SignUpAdminForm)
    template = 'edit_user.html'
    context = {'UserFormSet': UserFormSet}
    return render(request, template, context)

但是这个视图不起作用。我还看到了这些链接:1,2,3 和 4;但他们帮不了我,我不明白 该怎么办。 你能帮我写一下编辑视图吗?

【问题讨论】:

    标签: python django django-models django-forms django-2.2


    【解决方案1】:

    我认为你需要设置初始用户

    这个怎么样?

    def edit_user(request, id):
        user = get_object_or_404(User, id=id)
        if request.method == "POST":
            UserFormSet = SignUpAdminForm(request.POST, instance = user)
            if UserFormSet.is_valid():
                edit_user = UserFormSet.save(commit=False)
                edit_user.profile.bio = form.cleaned_data['bio']
                edit_user.profile.degree = form.cleaned_data['degree']
                edit_user.save()
                return redirect('view_user')
        else:
            UserFormSet = SignUpAdminForm(instance = user,initial={
                'bio':profile.bio,
                'degree': profile.degree})
        template = 'edit_user.html'
        context = {'UserFormSet': UserFormSet}
        return render(request, template, context)
    

    【讨论】:

    • 它引发了这个错误:TypeError: 'User' object is not iterable@flakavir
    • 抱歉,用实例 UserFormSet = SignUpAdminForm(instance = user) 更改初始值
    • 我确实工作了。但是对于Profile 模型的bio 和degree 字段仍然存在另一个问题:它没有显示我在创建用户时设置的先前值。怎么能处理这个? @flakavir
    • 如果需要,请使用初始值... UserFormSet = SignUpAdminForm(instance = user, initial={'bio': user.profile.bio, 'degree': user.profile.degree})
    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多