Field expected a number but got ' '
Не могу понять почему поле id_cs
пустое, если я это поле в forms.py
добавляю в exclude
, при этом же я ему присваиваю конкретное значение для записи. Все работает, если убираю его из exclude
. Но я бы все же хотел, чтобы оно было скрытым в шаблоне. Я точно знаю, что ему присваивается значение по умолчанию, в request.user.profile.id_cs
есть значение.
ValueError: Field 'id_cs' expected a number but got ''.
id_gpu :
Выберите корректный вариант. Вашего варианта нет среди допустимых значений.
Я также использую вложенные зависимые выпадающие списки и от выбранного id_cs
зависит, что будет в id_gpu
, вероятно, это происходит именно из-за этого. Значение же выбранного id_cs
передаю через кеш в js
views.py
class GroupCreateView(CreateView):
template_name = 'main/group.html'
model = Group
form_class = GroupForm
success_url = reverse_lazy('start')
def get(self, request, id_group=None, *args, **kwargs):
id_current_cs = request.user.profile.id_cs_id
form = self.form_class(initial={'id_cs': id_current_cs})
context = {
'form': form,
'id_current_cs': id_current_cs,
}
print('id_current_cs = ', id_current_cs)
return render(request, self.template_name, context)
def post(self, request, id_group=None, *args, **kwargs):
error = ''
form = GroupForm(request.POST)
if request.POST.get('save') and form.is_valid():
just_created = form.save(commit=False)
just_created.Create_User = request.user
just_created.id_filial = request.user.profile.id_filial
just_created.id_cs = request.user.profile.id_cs
just_created.save()
return HttpResponseRedirect(reverse('main:edit_work', args=(just_created.id_group,)))
elif request.POST.get('back'):
return HttpResponseRedirect(reverse('start', ))
else:
error = 'Форма заполнена некорректно'
context = {
'title': 'Группа работ',
'form': form,
'error': error,
}
return render(request, 'main/group.html', context)
def load_gpu(request):
id_cs = request.GET.get('id_cs')
list_gpu = GPU.objects.filter(id_cs=id_cs).order_by('name_gpu')
print('list_gpu =', list_gpu)
return render(request, 'main/gpu_dropdown_list_options.html', {'list_gpu': list_gpu})
models.py
class Filial(models.Model):
id_filial = models.AutoField(primary_key=True)
name_filial = models.CharField(max_length=256)
def __str__(self):
return self.name_filial
class Meta:
db_table = 'Filial'
verbose_name = 'Филиал'
verbose_name_plural = 'Филиалы'
class CS(models.Model):
id_cs = models.AutoField(primary_key=True)
name_cs = models.CharField(max_length=256)
id_filial = models.ForeignKey('Filial', models.DO_NOTHING, blank=True, null=True)
def __str__(self):
return self.name_cs
class Meta:
db_table = 'Compressor_station'
verbose_name = 'станция'
verbose_name_plural = 'станции'
class GPU(models.Model):
id_gpu = models.AutoField(primary_key=True)
name_gpu = models.CharField(max_length=256)
id_cs = models.ForeignKey('CS', models.DO_NOTHING, blank=True, null=True,
related_name='related_name_cs')
def __str__(self):
return self.name_gpu
class Meta:
db_table = 'G_p_u'
verbose_name = 'агрегат'
verbose_name_plural = 'агрегаты'
class Group(models.Model):
id_group = models.AutoField(primary_key=True)
id_filial = models.ForeignKey('Filial', models.DO_NOTHING, related_name='filial')
id_cs = GroupedForeignKey(CS, "id_filial", on_delete=models.SET_NULL, null=True, related_name='cs')
id_gpu = GroupedForeignKey(GasPumpingUnit, "id_cs", on_delete=models.SET_NULL, blank=True, null=True, related_name='gpu')
Create_User = models.CharField(max_length=256, blank=True, null=True)
def __str__(self):
return self.name_group
class Meta:
db_table = 'Group'
verbose_name = 'Группа работ'
verbose_name_plural = 'Группы работ'
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
employee_number = models.CharField(max_length=200, blank=True)
isAdmin = models.BooleanField(default=False)
isSpecialist = models.BooleanField(default=False)
id_filial = models.ForeignKey('Filial', models.SET_NULL, blank=True, null=True, related_name='Profile_filial')
id_cs = GroupedForeignKey(CS, "id_filial", blank=True, null=True, related_name='Profile_cs')
urls.py
urlpatterns = [
...
path('ajax/load-gpu/', views.load_gpu,
name='ajax_load_gpu')
]
forms.py
class GroupForm(ModelForm):
required_css_class = 'required'
class Meta:
model = Group
fields = [
'id_filial', 'id_cs',
'id_gpu',
'name_group', 'start_date', 'end_date', 'short_description']
exclude = (
'id_filial',
'id_cs'
)
widgets = {
"id_filial": Select(attrs={
'class': 'form-select'
}),
"id_cs": Select(attrs={
'class': 'form-select',
}),
"id_gpu": Select(attrs={
'class': 'form-select'
}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['id_gpu'].queryset = GasPumpingUnit.objects.none()
if 'id_cs' in self.data:
try:
id_cs = int(self.data.get('id_cs'))
self.fields['id_gpu'].queryset = GasPumpingUnit.objects.filter(id_cs=id_cs).order_by('name_gpu')
except (ValueError, TypeError):
pass # invalid input from the client; ignore and fallback to empty gpu queryset
elif self.instance.id_gpu:
self.fields['id_gpu'].queryset = self.instance.id_cs.related_name_cs.all().order_by('name_gpu')
file.js
jQuery( function($) {
let url = $("#groupForm").attr("data-list-gpu-url"); // get the url of the `load_gas_pumping_unit` view
$.ajax({ // initialize an AJAX request
url: url, // set the url of the request (= localhost:8000/main/ajax/load-gas-pumping-unit/)
data: {
'id_cs': csId // add the id_cs id to the GET parameters
},
success: function (data) { // `data` is the return of the `load_gas_pumping_unit` view function
$("#id_id_gpu").html(data); // replace the contents of the city input with the data that came from the server
}
});
});
file.html
{% for field in form.visible_fields %}
<table class='table align-middle table-borderless work-tab'>
<tbody>
<tr>
<td class="first">{{ field.label }}</td>
<td class="second">{{ field }}</td>
</tr>
</tbody>
</table>
{% endfor %}
<!--В цикле перечисленные все скрытые поля-->
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
<script>
let csId = '{{ id_current_cs|escapejs }}';
</script>