具有实例的 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 属性。
我正在尝试为我的用户创建一个自定义表单,以便他们可以编辑他们的个人资料。
因此,当他们登录时,我将用户 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 属性。