如何使用inlineformset更改ForeignKey值?

2024-09-30 22:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个模型和形式由外援“小队”连接。在我的模板中,我让用户首先键入球队名称,然后键入射手。我试图用ShooterSquad的'squad_name'硬编码我的射手的'squad'字段,这样用户就不必每次为每个射手键入球队名称

型号.py

class ShooterSquad(models.Model):
    squad_name = models.CharField(unique=True, max_length=100)
    school = models.CharField(max_length=100, null=False)

    def __str__(self):
        return self.squad_name

class Shooter(models.Model):
    name = models.CharField(max_length=100)
    squad = models.ForeignKey(ShooterSquad, to_field='squad_name', related_name='squad', on_delete=models.PROTECT)

    def __str__(self):
        return self.name

forms.py

class ShooterSquadForm(forms.ModelForm):
class Meta:
    model = ShooterSquad
    fields = ['squad_name', 'squad_total_score', ]

class ShooterForm(forms.ModelForm):
    class Meta:
        model = Shooter
        fields = '__all__'

class BaseShooterFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
    super(BaseShooterFormSet, self).__init__(*args, **kwargs)
    self.queryset = Shooter.objects.none()

ShooterFormSet = inlineformset_factory(
    ShooterSquad, Shooter,
    form=ShooterForm,
    formset=BaseShooterFormSet,
    extra=1,
    max_num=3,
    exclude=('squad',)
)

视图.py

def add_multiple_shooters(request):
if request.method == 'POST':
    squad_form = ShooterSquadForm(request.POST)
    formset = ShooterFormSet(request.POST)
    if squad_form.is_valid() and formset.is_valid():
        set_squad = squad_form.cleaned_data.get('squad_name')
        for f in formset.forms:
            f.cleaned_data['squad_id'] = set_squad
            f.cleaned_data['squad'] = set_squad
            print(formset.cleaned_data)
        squad_form.save()
        formset.save()
        return redirect('anasp:mainpage')
else:
    print("ERROR")
    formset = ShooterFormSet()
    squad_form = ShooterSquadForm()
context = {
    "title": title,
    "formset": formset,
    "squad_form": squad_form,
}
return render(request, "anasp/scores/shooter_formset.html", context)

Input Form Sample

我的数据打印:[{'shooter_number': 67, 'squad': 'Woodland', 'name': 'Legolas', 'DELETE': False, 'id': None, 'shooter_score': 39, 'squad_id': 'Woodland'}]

看来球队的身份变了,对吧?错。当我查看数据库时,我的团队id是<null> 我该如何解决这个问题

Python:3.5.4 Django:1.8


Tags: nameselfformreturnmodelsrequestdefforms
1条回答
网友
1楼 · 发布于 2024-09-30 22:19:25

我通过在进行所有更改之前不提交保存来修复它:

    if squad_form.is_valid():
        squad = squad_form.save(commit=False)

        if formset.is_valid():
            shooters_to_save = list()

            for f in formset.forms:
                shooter = f.save(commit=False)
                shooter.squad = squad
                shooters_to_save.append(shooter)

            squad.save()

            for shooter in shooters_to_save:
                shooter.save()
            return redirect('anasp:mainpage') 

相关问题 更多 >