Создайте дочернюю форму и измените родительскую одновременно, Django

#django #forms #parent

Вопрос:

У меня есть две модели, связанные с родителем и дочерним элементом foreignkey, я мог бы создать дочерние данные и одновременно изменить поле, присутствующее в родительской модели. спасибо за любую помощь

«‘ models.py

 class Richieste(models.Model):
    SCELTA_1 = [
        ('Estero', 'Estero'),
        ('Italia', 'Italia'),
    ]

    STATO = [
        ('In lavorazione', 'In lavorazione'),
        ('Chiuso esito POSITIVO', 'Chiuso esito POSITIVO'),
        ('Chiuso esito NEGATIVO', 'Chiuso esito NEGATIVO'),
    ]

    TIPO_PRODOTTO = [
        ('Esterno', 'Esterno'),
        ('Interno', 'Interno'),
    ]

    titolo = models.CharField(max_length=100, help_text='Indica Argomento/Agenzia richiedente')
    contenuto = models.TextField()
    data_creazione = models.DateTimeField(default=timezone.now)
    scelta_1 = models.CharField(max_length=50, choices=SCELTA_1, help_text='ITALI/ESTERO', verbose_name = "provenienza")
    stato = models.CharField(max_length=50, choices=STATO, default='In lavorazione' , blank = True, help_text='Stato richiesta')
    tipo_prodotto = models.CharField(max_length=50, choices=TIPO_PRODOTTO, blank = False, help_text='Esterno/Interno')
    protocollo = models.IntegerField(blank=True, null=True) #default='SOME STRING'
    allegato = models.FileField(upload_to='uploads//%Y/%m/%d/', blank = True, null=True, verbose_name = "allega documenti")
    allegato_img = models.ImageField(upload_to='uploads//%Y/%m/%d/', blank = True, null=True, verbose_name = "allega immagini")
    autore = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        template = '{0.titolo} {0.autore} '
        return template.format(self)

    def get_absolute_url(self):
        return reverse('speciali-home')

class Discussione(models.Model):
    risposta = models.ForeignKey(Richieste, on_delete=models.CASCADE)
    contenuto = models.TextField()
    data_risposta = models.DateTimeField(default=timezone.now)
    allegato = models.FileField(upload_to='uploads//%Y/%m/%d/', blank = True, null=True)
    elaboratore = models.ForeignKey(User, on_delete=models.CASCADE)

    
    def __str__(self):
        template = '{0.risposta} {0.elaboratore} '
        return template.format(self)
 

»
когда я создаю форму обсуждения, все работает нормально, но в той же форме я хочу изменить «Состояние» родительской модели «Ричиесте».

«‘ forms.py

 class DiscRispModelForm(forms.ModelForm):
    #stato = forms.ModelChoiceField(queryset=Richieste.objects.all())

    class Meta:
        model = Discussione
        fields = '__all__'

    def __init__(self, risposta_id=None, elaboratore_id=None, *args, **kwargs):
        super(DiscRispModelForm, self).__init__( *args, **kwargs)
        self.fields["risposta"].widget = forms.HiddenInput()
        self.fields["elaboratore"].widget = forms.HiddenInput()
        self.fields["data_risposta"].widget = forms.HiddenInput()
       

        if risposta_id:
            self.fields['risposta'].initial = risposta_id

        if elaboratore_id:
            self.fields['elaboratore'].initial = elaboratore_id
 

»’

«‘ views.py

 class DiscCreateView(LoginRequiredMixin, CreateView):
    model = Discussione
    template_name = 'discussione_nuova.html'
    form_class = DiscRispModelForm



def get_context_data(self, **kwargs):
        # we need to overwrite get_context_data
        # to make sure that our formset is rendered
        data = super().get_context_data(**kwargs)
        if self.request.POST:
            data["children"] = RichiesteForm(self.request.POST)
        else:
            data["children"] = RichiesteForm()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        children = context["children"]
        self.object = form.save()
        if children.is_valid():
            children.instance = self.object
            children.save()
        return super().form_valid(form)


    




    def get_success_url(self):
        return reverse_lazy('speciali-richiesta-singola', kwargs={'pk': self.kwargs.get('pk')})


    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs(*args, **kwargs)
        kwargs['risposta_id'] = self.kwargs.get('pk')
        kwargs['elaboratore_id'] = self.request.user
        return kwargs
 

»’

Ответ №1:

Вы должны переопределить метод сохранения() дочерней модели и изменить родительскую модель в соответствии с изменениями. Я не могу привести вам пример без примера ваших моделей.

Изменить: В вашем случае вы можете добавить дополнительное поле в форму модели и переопределить метод формы модели save() :

 class DiscRispModelForm(forms.ModelForm):
    stato = forms.ChoiceField(choices = [('In lavorazione', 'In lavorazione'),('Chiuso esito POSITIVO', 'Chiuso esito POSITIVO'),('Chiuso esito NEGATIVO', 'Chiuso esito NEGATIVO')])

    class Meta:
        model = Discussione
        fields = '__all__'

def __init__(self, risposta_id=None, elaboratore_id=None, *args, **kwargs):
    super(DiscRispModelForm, self).__init__( *args, **kwargs)
    self.fields["risposta"].widget = forms.HiddenInput()
    self.fields["elaboratore"].widget = forms.HiddenInput()
    self.fields["data_risposta"].widget = forms.HiddenInput()
   

    if risposta_id:
        self.fields['risposta'].initial = risposta_id

    if elaboratore_id:
        self.fields['elaboratore'].initial = elaboratore_id

def save(self, commit=True):
    # do something with self.cleaned_data['stato'] like:
    self.instance.risposta.stato = self.cleaned_data['stato']
    self.instance.risposta.save()

    return super(DiscRispModelForm, self).save(commit=commit)
 

Комментарии:

1. Спасибо, Пол, за ваш ответ, я публикую код, я хочу подчеркнуть, что это мой первый проект в django, у меня раньше не было опыта в кодировании, поэтому, пожалуйста, если у вас есть совет, сделайте его точным, потому что все мелочи для меня имеют решающее значение

2. Хорошо, какова ваша логика для отклонения или одобрения запроса?

3. это решение «Разработчика» (дочерней модели) о том, что анализ запроса может избежать или принять запрос

4. tks но что такое модель = точка?

5. Ошибка копирования/вставки.