gpt4 book ai didi

python - 在基于类的 View (CBV) 中引用当前用户

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:29 25 4
gpt4 key购买 nike

我实现了一个表单,我需要填充用户对象中的字段(名字、姓氏、电子邮件)以及填写新的成员对象。我已经使用基于函数的 View (FBV) 实现了这一点,但我觉得我应该能够使用基于类的 View (CBV) 来实现。问题的核心似乎是在不传递用户对象的情况下以一种形式引用当前用户。在 FBV 中很容易做到,但我找不到任何使用 CBV 的例子。我想我一定在这里遗漏了一些东西。

这是我的代码

模型.py

class Membership(models.Model):

"""Represents an active membership of a user. Both the start_date and
end_date parameters are inclusive."""

DEFAULT_DURATION = 365 # the default number of days a membership is active

start_date = models.DateField(auto_created=True)
end_date = models.DateField(null=True)
membership_type = models.ForeignKey(MembershipType)
referral = models.ForeignKey(User, related_name='membership_referral', null=True)

# Contact Info
phone = PhoneNumberField()

# Address Fields
address_1 = models.CharField(max_length=255)
address_2 = models.CharField(max_length=255, blank=True)

city = models.CharField(max_length=64)
state = USStateField()
zip_code = USPostalCodeField()

def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
"""Overload the save function to set the start and end date."""
self.start_date = datetime.date.today()
self.end_date = (self.start_date +
datetime.timedelta(days=self.membership_type.period))
super().save()

@property
def is_active(self):
return self.end_date >= datetime.date.today()

表单.py

class MembershipForm(ModelForm):
"""The Form shown to users when enrolling or renewing for membership."""

def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user", None)

_fields = ('first_name', 'last_name', 'email',)
_initial = model_to_dict(self.user, _fields) if self.user is not None else {}

super(MembershipForm, self).__init__(initial=_initial, *args, **kwargs)
self.fields.update(fields_for_model(User, _fields))
self.fields['referral'].required = False

class Meta:
model = Membership
fields = ['membership_type', 'referral', 'phone', 'address_1',
'address_2', 'city', 'state']

zip_code = USZipCodeField(max_length=5, required=True)

def save(self, *args, **kwargs):
self.user.first_name = self.cleaned_data['first_name']
self.user.last_name = self.cleaned_data['last_name']
self.user.email = self.cleaned_data['email']
self.user.save()
profile = super(MembershipForm, self).save(*args, **kwargs)
return profile

View .py

@login_required
def enroll(request):
template_name = 'enroll.html'

if request.method == 'POST':
form = MembershipForm(request.POST, user=request.user)

if form.is_valid():
form.save()
return redirect('/')
else:
form = MembershipForm(user=request.user)

return render(request, template_name, {'form': form})

最佳答案

您可以通过 self.request.user 在基于类的 View 中访问当前用户。它可以通过重新定义验证方法在 FormView 中设置,如下所示:

class YourView(CreateView)
...

def form_valid(self, form):
form.instance.user = self.request.user
return super(YourView, self).form_valid(form)

我在示例中使用了 CreateView 而不是 FormView,因为对于编辑,出于安全目的,您应该额外检查当前实例的用户。

关于python - 在基于类的 View (CBV) 中引用当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23497722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com