Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
237 views
in Technique[技术] by (71.8m points)

python - How to save a model in ModelForm with two ForeignKey fields in Django

There is a model Listaflor linked to Estados with another model named Flora2Estado, i made a form with ModelMultipleChoiceField. It saves successfully into Listaflor but nothing into the Flora2Estado, what can i do about this?

forms.py

class FloForm(forms.ModelForm):
    familia = forms.ModelChoiceField(queryset=Familia.objects.all().order_by('familia_nome').filter(aprovado=1))
    Especie = forms.CharField(label="Nome da espécie*")
    estados = forms.ModelMultipleChoiceField(queryset=EstadosM.objects.all().order_by('nome_abbr'))
    class Meta:
        model = Listaflor
        ordering = ["estados",]
        fields = ['Especie','estados']

views.py

def CreateFlo(request):
    form = FloForm()
    if request.method == 'POST':
        form = FloForm(request.POST)
        if form.is_valid():
            Listaflor = form.save(commit=False)
            Flora2Estado = form.save(commit=False)
            Listaflor.save()
            Flora2Estado.save()
  
    return render(request,'accounts/enviar_flora.html')

models.py

class Flora2Estado(models.Model):
    estado = models.ForeignKey(EstadosM, models.CASCADE)
    especie = models.ForeignKey(Listaflor, models.CASCADE)
    flora2estado = models.AutoField(primary_key=True)
    class Meta:
        managed = False
        db_table = 'flora2estado'
        unique_together = (('estado', 'especie'),)

Any tips on helping me making a better post is welcome, have a good day!

View.py updated: returning Validation error!

def CreateFlo(request):    
    EstadosInlineFormSet  = inlineformset_factory(Listaflor, Flora2Estado, form=Flo2Form)
    Form = FloForm(request.POST)
    storeForm = FloForm(request.POST)
    if Form.is_valid():
        new_store = storeForm.save()
        florInlineFormSet = EstadosInlineFormSet(request.POST or None, request.FILES or None, instance=new_store)

        if florInlineFormSet.is_valid():
            florInlineFormSet.save()
    context = {'form': Form}
    return render(request,'accounts/enviar_flora.html', context)

models.py:

class Flora2Estado(models.Model):
    estado = models.ForeignKey(EstadosM, models.CASCADE)
    especie = models.ForeignKey(Listaflor, models.CASCADE)
    flora2estado = models.AutoField(primary_key=True)
    class Meta:
        managed = False
        db_table = 'flora2estado'
        unique_together = (('estado', 'especie'),)
class Listaflor(models.Model):
    especie_id = models.AutoField(primary_key=True)
    familia = models.ForeignKey(Familia, models.DO_NOTHING, db_column='familia_id', blank=True, null=True)
    Especie = models.CharField(db_column='especie', max_length=255, blank=True, null=True) 

I tried this:

def CreateFlo(request):
    form = FloForm()
    if request.method == 'POST':
        form = FloForm(request.POST)
        if form.is_valid():
            listafor = form.save()
            estados = form.cleaned_data.get('estados')
            for estado in estados:
                Flora2Estado.objects.create(especie=listafor, estado= estado)
    texto="..."
    context = {'floForm': form,'texto': texto}
    return render(request, 'accounts/enviar_flora.html', context)

got the error:

django.db.utils.IntegrityError: (1062, "Duplicate entry '18-3256' for key 'PRIMARY'")

error!

question from:https://stackoverflow.com/questions/65924574/how-to-save-a-model-in-modelform-with-two-foreignkey-fields-in-django

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

It is because you have clearly mentioned Listaflor here:

class Meta:
    model = Listaflor

Eventhough if you've changed it to

class Meta:
    model = Flora2Estado

You can't save the ForeignKey fields in Flora2Estado like that.

Let's have a look at this on Saving Django ModelForm with a ForeignKey


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...