【发布时间】:2023-03-11 22:09:01
【问题描述】:
我的 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”方式来做到这一点?
谢谢!
【问题讨论】:
标签: python django inheritance django-models