python – 用于多对多关系的内联表单集的链接

前端之家收集整理的这篇文章主要介绍了python – 用于多对多关系的内联表单集的链接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

遵循Kevin Dias在this article中的说明,我尝试为两个相关模型生成一个表单.这似乎适用于一对多的关系,但是我遇到了使用多对多关系的问题.

以下是用户角色管理的一些示例代码

  1. #models.py
  2. from django.db import models
  3. class Role(models.Model): # for each role there can be multiple users
  4. role_name=models.CharField(max_length=20)
  5. class User(models.Model): # each user can have multiple roles
  6. name=models.CharField(max_length=20)
  7. role=models.ManyToManyField(Role,through='UserRole')
  8. class UserRole(models.Model): # table to store which user has which roles
  9. role=models.ForeignKey(Role)
  10. user=models.ForeignKey(User)
  11. # forms.py
  12. from django.forms import ModelForm
  13. from django.forms.models import inlineformset_factory
  14. from rightmanagement.models import Role,User
  15. class UserForm(ModelForm):
  16. class Meta:
  17. model = User
  18. RoleFormSet = inlineformset_factory(User,Role) # this is probably the line that causes the problem
  19. # views.py
  20. from django.http import HttpResponseRedirect
  21. from rightmanagement.models import User
  22. from rightmanagement.forms import RoleFormSet,UserForm
  23. # Create view
  24. from django.views.generic import CreateView
  25. class UserCreate(CreateView):
  26. model = User
  27. form_class = UserForm
  28. def get(self,request,*args,**kwargs):
  29. """
  30. Handles GET requests and instantiates blank versions of the form
  31. and its inline formsets.
  32. """
  33. self.object = None
  34. form_class = self.get_form_class()
  35. form = self.get_form(form_class)
  36. role_form = RoleFormSet()
  37. return self.render_to_response(
  38. self.get_context_data(form=form,role_form=role_form))
  39. def post(self,**kwargs):
  40. """
  41. Handles POST requests,instantiating a form instance and its inline
  42. formsets with the passed POST variables and then checking them for
  43. validity.
  44. """
  45. self.object = None
  46. form_class = self.get_form_class()
  47. form = self.get_form(form_class)
  48. role_form = RoleFormSet(self.request.POST)
  49. if (form.is_valid() and role_form.is_valid()):
  50. return self.form_valid(form,role_form)
  51. else:
  52. return self.form_invalid(form,role_form)
  53. def form_valid(self,form,role_form):
  54. """
  55. Called if all forms are valid. Creates a Recipe instance along with
  56. associated Ingredients and Instructions and then redirects to a
  57. success page.
  58. """
  59. self.object = form.save()
  60. role_form.instance = self.object
  61. role_form.save()
  62. return HttpResponseRedirect(self.get_success_url())
  63. def form_invalid(self,role_form):
  64. """
  65. Called if a form is invalid. Re-renders the context data with the
  66. data-filled forms and errors.
  67. """
  68. return self.render_to_response(
  69. self.get_context_data(form=form,role_form=role_form))

这些设置会导致错误消息< class'rightmanagement.models.Role'>没有ForeignKey到< class'rightmanagement.models.User'>.

做了一些研究我发现了这个:Django inlineformset_factory and ManyToMany fields.看起来内联表单集只适用于ForeignKey而不适用于ManyToManyField. the docs也可以这样解释.

但是,我认为在特定情况下,外键而不是多对多关系是没有任何意义的. Django的内置内联formset的挂件如何看起来像是多对多的关系?目标是构建一个表单,允许将用户分配给已存在的角色或创建新角色,如果用户尚不存在则将其分配给用户.

最佳答案
您可能已经意识到,您无法使用内联表单集编辑多对多关系.但是,您可以编辑直通模型.因此,对于内联formset,您只需将模型设置为直通模型,如下所示:

  1. RoleFormSet = inlineformset_factory(UserRole,User.role.through)

猜你在找的Python相关文章