python - 坚持将多对多关系与 Modelform 联系起来
问题描述
我对 Django 很陌生,我正在做一个目前需要以下内容的项目:
我有两个基本结构:一个项目模型和一个 TeamMember 模型——它们都通过多对多关系相互关联。然后我有一个 TMAAssigned 'through' 类。随着时间的推移,团队成员将有许多项目分配给它。
我有一个 ModelFrom,它通过创建表单来创建一个项目模型。
我的问题是,如何在提交表单后将团队成员链接到新创建的项目?
这是我的一些模型和表单代码:
团队成员
class TeamMember(models.Model):
firstname = models.CharField(max_length=100, default= "First Name")
lastname = models.CharField(max_length=100, default= "Last Name")
fullname = models.CharField(max_length=100, default= "Full Name")
email = models.EmailField(max_length=254)
cellphone = PhoneNumberField(null=False, blank=False, unique=True)
numberofcases = models.IntegerField(max_length=10000, default=0)
@property
def fullnamefunc(self):
fullname = "{} {}".format(self.firstname, self.lastname)
return fullname
def __str__(self):
return self.fullname
项目
class Project(models.Model):
pursuitname = models.CharField(max_length=500)
datecreated = models.DateTimeField(auto_now=True)
bdmember = models.ManyToManyField('team.TeamMember')
视图.py
class bdFormView(TemplateView):
template_name = os.path.join(BASE_DIR, "templates/masterform/bdform.html")
def get(self,request):
form = bdForm()
return render (request, self.template_name, {'form': form})
def post(self, request):
form = bdForm(request.POST)
if form.is_valid():
print("form is valid")
project = form.save(commit=False)
project.save()
text = form.cleaned_data['briefcard']
表格.py
class bdForm(forms.ModelForm):
bdmemberlist = TeamMember.objects.all().order_by('lastname')
pursuitname = forms.CharField()
bdmember = forms.ModelChoiceField(queryset= bdmemberlist)
addbdteam = forms.ModelMultipleChoiceField(
queryset=TeamMember.objects.all().order_by('lastname'), widget=Select2MultipleWidget, required=False)
class Meta:
model = Project
fields = ['pursuitname','addbdteam','bdmember',]
def __init__(self, *args, **kwargs):
if kwargs.get('instance'):
initial = kwargs.setdefault('initial', {})
initial['projects'] = [t.pk for t in
kwargs['instance'].project_set.all()]
forms.ModelForm.__init__(self, *args, **kwargs)
def save(self, commit=True):
instance = forms.ModelForm.save(self, False)
old_save_m2m = self.save_m2m
def save_m2m():
old_save_m2m()
for project in self.cleaned_data['bdmember']:
instance.teammember_set.add(project)
提前致谢!!
编辑-在做了更多研究之后,我从脚本中删除了“通过”模型,并试图依靠 form.py 保存方法来进行连接。但是,当我这样做时 - 两者仍然没有正确连接。
解决方案
由于只有您的管理员(超级用户?)会登录,因此您可以使用内置的 Django Admin 开始。
我会向你推荐这个,至少现在是这样,因为你是一个初学者,而且管理表单使用起来非常简单。然后,您可以稍后在您感觉更舒服时创建自定义表单。:-)
考虑到这一点,您可以尝试消除“通过”表(您可能需要重置迁移),然后尝试此操作。
管理员.py
from django.contrib import admin
from .models import TeamMember, TMAssigned, Project,
TeamMembersInLine(admin.TabularInline):
model = TeamMember
extra = 1
@admin.register(Project):
class ProjectAdmin(admin.ModelAdmin):
list_display = ('pursuitname', 'bdmember ', 'datecreated')
inlines = [TeamMembersInLine]
这是另一个深入研究直通表的答案。有人在你的情况下问过这个问题,答案也很相关。
推荐阅读
- javascript - 引导带中的下拉不起作用 - 在控制台中显示 popper.js
- jenkins - 我们如何选择在 Active Choice Reactive Reference Parameter 中输入文本输入并能够在其 groovy 脚本中读取文件参数?
- python - 如何解决 Python 3 中的这个缩进错误?
- xml - 如何删除除少数特定空标签外的空 xml 元素
- python - 如何将给定文本文件中从元音开始的单词写入另一个文本文件?
- kotlin - 为什么返回:kotlin.Unit
- svn - 如何使用 TortoiseSVN 从文件同步混淆中恢复
- mql4 - 数组超出范围 mql4
- java - SQLite 按列值的一部分过滤记录
- anylogic - 为不同的流程使用中央数据库并通过动态事件获取访问权限