使用Django模型继承时如何避免这种冗余?

吉姆

我的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=Truenull=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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何避免这种冗余和关闭不使用的文件类?

来自分类Dev

使用django / javascript时如何避免这种意外的令牌错误?

来自分类Dev

在Kotlin中继承时避免冗余代码

来自分类Dev

如何避免视图模型的冗余属性

来自分类Dev

设计模式是如何使用列表时避免}这种

来自分类Dev

如何避免数据库模型中的冗余?

来自分类Dev

在Java中使用继承时,如何避免重用代码?

来自分类Dev

在这种情况下如何避免多重继承?

来自分类Dev

Django条件查询:如何避免这种情况?

来自分类Dev

通过pexpect发送命令时如何避免冗余?

来自分类Dev

使用继承时避免重复相同的代码

来自分类Dev

避免在面向对象的继承中使用协方差的冗余代码

来自分类Dev

如何避免使用MVC记录冗余数据

来自分类Dev

使用webpack时如何避免这种硬编码的index.js?

来自分类Dev

使用webpack时如何避免这种硬编码的index.js?

来自分类Dev

在这种情况下,如何避免在Django视图中使用硬编码的url?

来自分类Dev

django模型继承:模型创建如何与Custom Manager一起使用?

来自分类Dev

如何实现这种继承

来自分类Dev

如何查询集继承模型Django?

来自分类Dev

如何从Django模型继承和过滤数据

来自分类Dev

如何避免这种缩小?

来自分类Dev

如何避免这种重叠?

来自分类Dev

如何避免这种缩小?

来自分类Dev

在保存Django模型期间如何避免递归

来自分类Dev

如何避免Django模型中的日期重叠?

来自分类Dev

如何避免在Django模型字段中重复?

来自分类Dev

在odoo中删除子模型(使用继承的主模型创建)的记录时,如何删除主模型的记录

来自分类Dev

使用合成和继承时避免在Java中使用菱形

来自分类Dev

使用合成和继承时,避免在Java中使用菱形

Related 相关文章

  1. 1

    如何避免这种冗余和关闭不使用的文件类?

  2. 2

    使用django / javascript时如何避免这种意外的令牌错误?

  3. 3

    在Kotlin中继承时避免冗余代码

  4. 4

    如何避免视图模型的冗余属性

  5. 5

    设计模式是如何使用列表时避免}这种

  6. 6

    如何避免数据库模型中的冗余?

  7. 7

    在Java中使用继承时,如何避免重用代码?

  8. 8

    在这种情况下如何避免多重继承?

  9. 9

    Django条件查询:如何避免这种情况?

  10. 10

    通过pexpect发送命令时如何避免冗余?

  11. 11

    使用继承时避免重复相同的代码

  12. 12

    避免在面向对象的继承中使用协方差的冗余代码

  13. 13

    如何避免使用MVC记录冗余数据

  14. 14

    使用webpack时如何避免这种硬编码的index.js?

  15. 15

    使用webpack时如何避免这种硬编码的index.js?

  16. 16

    在这种情况下,如何避免在Django视图中使用硬编码的url?

  17. 17

    django模型继承:模型创建如何与Custom Manager一起使用?

  18. 18

    如何实现这种继承

  19. 19

    如何查询集继承模型Django?

  20. 20

    如何从Django模型继承和过滤数据

  21. 21

    如何避免这种缩小?

  22. 22

    如何避免这种重叠?

  23. 23

    如何避免这种缩小?

  24. 24

    在保存Django模型期间如何避免递归

  25. 25

    如何避免Django模型中的日期重叠?

  26. 26

    如何避免在Django模型字段中重复?

  27. 27

    在odoo中删除子模型(使用继承的主模型创建)的记录时,如何删除主模型的记录

  28. 28

    使用合成和继承时避免在Java中使用菱形

  29. 29

    使用合成和继承时,避免在Java中使用菱形

热门标签

归档