Django- createview с параметром url показывает ошибку
Я создал представление с помощью generic view createview, в это представление я передаю параметр по url, у меня есть форма, но после нажатия на кнопку submit она перенаправляется на тот же url без параметра и показывает ошибку, я пытался проверить недействительность формы с помощью "form_invalid", но она не переходит туда, она также не переходит на "form_valid" и "get_success_url" не работает, я не знаю что не так. Я хочу перенаправить его в то же представление с параметром в url.
введите описание изображения здесь
url.py
app_name = 'gestionAsignacion'
urlpatterns = [
path('asignacionContact/<int:pk>',AsignacionCreateView.as_view(), name='asignacion_contact'),
path('detalle/asignacion/<int:pk>',descargarAsignacion.as_view(), name='descargar_asignacion'),
path('asignacionGeneral/',asignacionGeneral.as_view(), name='asignacion_general'),
]
view.py
class AsignacionCreateView(CreateView):
model=AsignacionContact
form_class=AsignacionForm
template_name='gestionAsignacion/asignacion_contact.html'
# success_url = reverse_lazy('gestionAsignacion:asignacion_general')
def get_initial(self):
# call super if needed
return {'idasignacion_general': self.kwargs['pk']}
def form_valid(self, form):
print('hola form_valid')
isvalid = super().form_valid(form)
return isvalid
def form_invalid(self, form):
print ("form is invalid")
return super().form_invalid(form)
def get_success_url(self):
return HttpResponseRedirect(reverse('gestionAsignacion:asignacion_general'))
def get_context_data(self, **kwargs):
# Llame primero a la implementación base para obtener un contexto
context = super().get_context_data(**kwargs)
# Agregar un QuerySet de todos los libros
context['asig_general'] = AsignacionGeneral.objects.get(id=self.kwargs['pk'])
context['object_list'] = AsignacionContact.objects.filter(idasignacion_general=self.kwargs['pk'])
return context
model.py
class AsignacionContact(models.Model):
id = models.IntegerField(primary_key=True)
idasignacion_general = models.ForeignKey('AsignacionGeneral', models.DO_NOTHING, db_column='idasignacion_general')
nombre_asignacion = models.CharField(max_length=100, blank=True, null=True)
fecha_inicio = models.DateField(blank=True, null=True)
fecha_fin = models.DateField(blank=True, null=True)
observacion = models.CharField(max_length=255, blank=True, null=True)
def __str__(self):
return self.nombre_asignacion
class Meta:
managed = False
db_table = 'asignacion_contact'
form.py
class AsignacionForm(ModelForm):
def __init__(self, *args, **kwargs):
super(AsignacionForm, self).__init__(*args, **kwargs)
for field in iter(self.fields):
self.fields[field].widget.attrs.update({
'class': 'form-control'
})
class Meta:
model=AsignacionContact
fields=['idasignacion_general','nombre_asignacion','fecha_inicio','fecha_fin','observacion']
Это path('asignacionContact/<int:pk>',... означает, что первичный ключ объекта необходим для отображения представления.
Например, объект с pk=1 будет работать для пути URL asignacion/asignacionContact/1.
У вас нет представления, которое просто asignacion/asignacionContact/ в вашем urls.py.
Поэтому вы получаете сообщение Page not found (404).
Я думаю, вы считаете, что <int:pk> в urls.py - это GET querystrings. Это не так. Это необходимые значения URL. Параметры GET появляются в URL, например, если вы отправляете форму с помощью method="GET". Данные формы появятся в URL.