#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. Ошибка копирования/вставки.