如何在Django订单表单中自动填充已登录用户的用户名与邮箱
实现登录用户自动填充订单表单信息
要让登录状态的用户下单时,自动将用户名和邮箱填入订单表单,只需修改视图中表单初始化的逻辑,结合用户登录状态传入初始数据即可。
修改views.py代码
def order_create(request): cart = Cart(request) if request.method == 'POST': form = OrderCreateForm(request.POST) if form.is_valid(): order = form.save() for item in cart: OrderItem.objects.create(order=order, product=item['post'], price=item['price']) cart.clear() return render(request, 'store/orders/created.html', {'order': order}) else: # 初始化表单时,若用户已登录则传入用户名和邮箱作为初始值 initial_data = {} if request.user.is_authenticated: initial_data['username'] = request.user.username initial_data['email'] = request.user.email form = OrderCreateForm(initial=initial_data) return render(request, 'store/orders/create.html', {'cart': cart, 'form': form})
可选优化:锁定已填充字段(禁止用户修改)
如果希望登录用户无法修改自动填充的用户名和邮箱,可以给表单字段添加disabled属性:
1. 修改forms.py
class OrderCreateForm(forms.ModelForm): username = forms.CharField(label='Имя пользователя', widget=forms.TextInput(attrs={'class': 'form-control'})) email = forms.EmailField(label='E-mail', widget=forms.EmailInput(attrs={'class': 'form-control'})) vk_or_telegram = forms.CharField(label='Введите ссылку на vk или telegram для связи с админом', widget=forms.TextInput(attrs={'class': 'form-control'})) captcha = ReCaptchaField() class Meta: model = Order fields = ('username', 'email', 'vk_or_telegram') def __init__(self, *args, **kwargs): # 从参数中取出用户对象 user = kwargs.pop('user', None) super().__init__(*args, **kwargs) # 若用户已登录,禁用用户名和邮箱输入框 if user and user.is_authenticated: self.fields['username'].widget.attrs['disabled'] = True self.fields['email'].widget.attrs['disabled'] = True
2. 修改views.py中的表单实例化逻辑
# 在GET分支中修改表单实例化代码 form = OrderCreateForm(initial=initial_data, user=request.user)
3. 处理表单提交时的字段赋值
由于disabled字段不会被提交到后台,需要在保存订单时手动赋值:
if form.is_valid(): # 先不保存到数据库 order = form.save(commit=False) # 若用户已登录,手动设置用户名和邮箱 if request.user.is_authenticated: order.username = request.user.username order.email = request.user.email # 保存订单 order.save()
内容的提问来源于stack exchange,提问作者Zesshi
相关产品推荐
相关产品推荐

