具有多个外键的 Django 内联表单 [英] Django inline forms with multiple foreign keys

查看:27
本文介绍了具有多个外键的 Django 内联表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的模板中使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆