我的Django网站中的所有页面都有页脚链接“反馈/问题”。如果新用户进入该站点并单击该链接,则应将他们定向到带有下拉菜单的表单,以表明他们是否有反馈和问题,以及电子邮件地址和反馈或问题的字段。该页面将具有所有未经身份验证的用户都会看到的简单标题。另一方面,如果站点成员登录并通过了身份验证,则他们应该看到相同的表单,但没有电子邮件字段(因为我已经知道他们的电子邮件地址),并且包含站点内部导航栏,按钮等的其他经过身份验证的标头。
我最初的想法是创建一个抽象类FeedbackQuestion:
class FeedbackQuestion(models.Model):
submission_type = ... (type, i.e. feedback or question)
submission_text = ... (actual feedback or question)
...
class Meta:
abstract = True
然后,我将创建两个单独的具体子类:
class AnonFeedbackQuestion(FeedbackQuestion):
email = models.EmailField(...)
class Meta:
db_table = anon_feedback_question
class AuthFeedbackQuestion(FeedbackQuestion):
user = models.ForeignKey(User, related_name="user")
class Meta:
db_table = auth_feedback_question
这两个类将具有自己的模型形式:
class AnonFeedbackQuestionForm(ModelForm):
class Meta:
model = AnonFeedbackQuestion
fields = ['submission_type', 'submission_text', 'email']
class AuthFeedbackQuestionForm(ModelForm):
class Meta:
model = AuthFeedbackQuestion
fields = ['submission_type', 'submission_text']
我预见的问题是,在显示反馈表单的视图中,我将必须执行以下操作:
def get_feedback_questions(request, template):
if request.method == 'POST':
...
if request.user.is_authenticated():
form = AuthFeedbackQuestionForm(request.POST)
else:
form = AnonFeedbackQuestionForm(request.POST)
if form.is_valid():
(process form)
...
else:
if request.user.is_authenticated():
form = AuthFeedbackQuestionForm(request.POST)
else:
form = AnonFeedbackQuestionForm(request.POST)
...
context = {'form': form}
return render(request, template, context)
必须重复这些if / then / else块来确定要使用哪种形式,这似乎不太明智。有没有更好,更清洁的“ Django”方法来做到这一点?
谢谢!
我不会继承您的模型-如果这是一个匿名问题,您可以使用和在一个模型上包括一个user
属性以及一个email
属性:blank=True
null=True
class FeedbackQuestion(models.Model):
submission_type = ... (type, i.e. feedback or question)
submission_text = ... (actual feedback or question)
email = models.EmailField(..., blank=True, null=True)
user = models.ForeignKey(User, related_name="user", blank=True, null=True)
...
class Meta:
abstract = True
这样,您可以email
为匿名用户的反馈/问题添加,或者为user
他们进行身份验证。
然后,我将您的表单合并到一个包含电子邮件字段的表单中,但是请根据用户是否通过身份验证删除电子邮件字段(请参阅此答案):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(UserForm, self).__init__(*args, **kwargs)
if self.user:
# For logged-in users, email field not necessary
self.fields.pop('email')
else:
# Otherwise, the field needs to be required
self.fields['email'].required = True
然后,您只需要确保在清理表单数据时正确创建用户即可(例如,确保电子邮件地址尚未被使用等)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句