具有多个外键的 Django 内联表单 [英] Django inline forms with multiple foreign keys
问题描述
我正在尝试在我的模板中使用 Django 的 ModelForm 和内联表单.但是,我找不到任何文档可以巧妙地映射到具有多个外键的数据库模型返回同一个表.这些是我的模型:
I'm trying to use Django's ModelForm and inline forms in my templates. However, I cannot find any documentation that maps neatly to a database model with multiple foreign keys back to the same table. These are my models:
# models.py
class Universities(models.Model):
name = models.CharField(max_length=100)
class Majors(models.Model):
name = models.CharField(max_length=80)
class Resumes(models.Model):
name = models.CharField(max_length=70)
undergrad = models.ForeignKey(Universities, related_name='undergrad_university')
undergrad_major = models.ForeignKey(Majors, related_name='undergrad_major')
grad = models.ForeignKey(Universities, related_name='grad_university')
grad_major = models.ForeignKey(Majors, related_name='grad_major')
我如何让 Django 生成一个表单来提交简历,用户可以在其中输入他们的大学名称和专业?在保存新简历之前,所有四个都将用于在各自的数据库中创建新条目(2 个在大学,2 个在专业),类似于 内联表单集示例适用于单一外键.
How can I have Django generate a form for submitting Resumes where users can type in their university name and major? All four of which would be used to create new entries in their respective databases (2 in Universities, 2 in Majors) before saving the new resume similar to how the inline formset example works for a singular foreign key.
推荐答案
EDIT2 :用于制作表单.我想我已经完成了一个个性化的表单,覆盖了 save() 方法,就像这样 (forms.py):
EDIT2 : For making a form. I guess I'd have done a personalized form with overriding of save() method, something like this (forms.py):
class YourForm(forms.Form):
fname = forms.CharField(label="name",max_length=70,validators=[#Choose your validators here])
fundergrad = forms.CharField(label="fundergrad",max_length=100,validators=[#Choose your validators here])
fundergrad_major = forms.CharField(label="fundergrad_major",max_length=80,validators=[#Choose your validators here])
fgrad = forms.CharField(label="fgrad",max_length=100,validators=[#Choose your validators here])
fgrad_major = forms.CharField(label="fgrad_major",max_length=80,validators=[#Choose your validators here])
def save(self, datas):
res = Resumes()
res.name = datas['fname']
undergrad = Universities()
undergrad_major = Majors()
grad = Universities()
grad_major = Majors()
undergrad.name = datas['fundergrad']
undegrad_major.name = datas['fundergrad_major']
grad.name = datas['fgrad']
grad_major.name = datas['fgrad_major']
undergrad.save()
undergrad_major.save()
grad.save()
grad_major.save()
res.undergrad = undergrad
res.undergrad_major = undergrad_major
res.grad = grad
res.grad_major = grad_major
res.save()
return res
在 views.py 中:
In views.py :
def formView(request) :
if request.method == 'POST':
form = YourForm(request.POST)
if form.is_valid():
datas={}
datas['fundergrad']=form.cleaned_data['fundergrad']
datas['fundergrad_major']=form.cleaned_data['fundergrad_major']
datas['fgrad']=form.cleaned_data['fgrad']
datas['fgrad_major']=form.cleaned_data['fgrad_major']
form.save(datas)
#Then do what you have to do in your view
EDIT1 :(不回答问题,但它可能对某人有所帮助,所以我放在这里)
EDIT1 : (doesn't answer the question, but it could help someone maybe so I let it here)
我会在 admin.py 中尝试这样的东西:
I would have tried with something like this in admin.py:
class UniversitiesInline1(admin.StackedInline):
model = Universities
fk_name = "undergrad"
class UniversitiesInline2(admin.StackedInline):
model = Universities
fk_name = "grad"
class MajorsInline1(admin.StackedInline):
model = Majors
fk_name = "undergrad_major"
class MajorsInline2(admin.StackedInline):
model = Majors
fk_name = "grad_major"
class ResumesAdmin(admin.ModelAdmin)
inlines = [
UniversitiesInline1,
UniversitiesInline2,
MajorsInline1,
MajorsInline2,
]
admin.site.register(Resumes, ResumesAdmin)
说明:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-a-model-with-two- 或更多外来键到同父模型
这篇关于具有多个外键的 Django 内联表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!