具有实例的 ModelForm = 会话 ID

ModelForm with Instance = Session ID

我正在尝试为我的用户创建一个自定义表单,以便他们可以编辑他们的个人资料。

因此,当他们登录时,我将用户 ID 保存在会话中,并尝试显示包含用户数据的自定义表单(由 3 类 组成),但它不起作用.. .

forms.py:

class EditUser(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name']

class EditUserProfilePublic(forms.ModelForm):
    class Meta:
        model = UserProfilePublic
        fields = ['website', 'facebook', 'twitter', 'google', 'books_frequency', 'favorite_types_of_books', 'hobbies', 'quote']

class EditUserProfilePrivate(forms.ModelForm):
    class Meta:
        model = UserProfilePrivate
        fields = ['address', 'address_bis', 'zipcode', 'city']

views.py:

@login_required
def edit_user(request):
    if request.method == 'POST':
        pass
    else:
        member = User.objects.get(pk=request.session['user_id'])
        formUser = EditUser(instance=member)
        formPublic = EditUserProfilePublic(instance=member)
        formPrivate = EditUserProfilePrivate(instance=member)

    return render(request, 'membres/edit_user.html', locals())

template.html

<div class="large-6 medium-6 small-12 columns">
    <div class="row collapse prefix-radius">
        <label for="{{ formPublic.website.id_for_label }}">Site internet</label>
        <div class="large-2 medium-2 small-2 columns">
            <span class="prefix"><i class="fa fa-globe"></i></span>
        </div>
        <div class="large-10 medium-10 small-10 columns">
            {{ formPublic.website }}
        </div>
   </div>
</div> (and so on)

models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    slug = models.SlugField(max_length=30)
    avatar = models.ImageField(null=True, blank=True, upload_to="avatars/")

    def __str__(self):
        return self.user

class UserProfilePublic(models.Model):
    FREQUENCY_CHOICES = (
        ('', ''),
        ('1', 'Moins de 2 romans'),
        ('2', 'Entre 2 et 5 romans'),
        ('3', 'Entre 6 et 10 romans'),
        ('4', 'Plus de 2 romans')
    )

    user = models.OneToOneField(User)
    website = models.URLField(blank=True)
    facebook = models.URLField(blank=True)
    twitter = models.URLField(blank=True)
    google = models.URLField(blank=True)
    hobbies = models.CharField(max_length=250, blank=True)
    books_frequency = models.CharField(max_length=1, choices=FREQUENCY_CHOICES, default='')
    favorite_types_of_books = models.TextField(blank=True)
    favorite_books = models.TextField(blank=True)
    quote = models.CharField(max_length=250, blank=True)

    def __str__(self):
        return self.user

class UserProfilePrivate(models.Model):
    user = models.OneToOneField(User)
    address = models.CharField(max_length=250, blank=True)
    address_bis = models.CharField(max_length=250, blank=True)
    zipcode = models.CharField(max_length=5, blank=True)
    city = models.CharField(max_length=30, blank=True)

    def __str__(self):
        return self.user

我的表格仍然是空的,没有显示任何错误... 顺便说一句,我可以使用管理工具来做这样的事情吗?

EditUserProfilePublic 表单的实例应该是 UserProfilePublic 模型的实例,您传递的是 User 实例。像

formPublic = EditUserProfilePublic(实例=member.userprofilepublic)

EditUserProfilePrivate 表单也一样。

-

无需在会话中存储用户 ID,也无需在您的视图中查询用户 table。用户 ID 已经在会话中,因为这就是登录的简单方式,并且由于他们已登录 request.user 已经是相关的用户实例。

但是,您确实需要将实际的 UserProfilePublic 和 UserProfilePrivate 实例传递给相关表单,而不是 User 实例。所以:

@login_required
def edit_user(request):
    formUser = EditUser(instance=request.user)
    formPublic = EditUserProfilePublic(instance=request.user.userprofilepublic)
    formPrivate = EditUserProfilePrivate(instance=request.user.userprofileprivate)

这假设您的用户 class 与 UserProfilePublic 和 UserProfilePrivate 具有一对一的关系,并且您没有更改 related_name 属性。