Kiedy wysyłam formularz, otrzymałem ten błąd Pole „id” spodziewałem się wartości, ale otrzymałem. Dlaczego otrzymałem ten błąd? Co jest nie tak w moim kodzie :(
Widok:
def employee_list(request):
if request.POST and request.FILES:
form = EmployeeForm(request.POST, request.FILES)
if form.is_valid():
data = form.save(commit=False)
data.user = RiverTimeUser.objects.create_user(
username=request.POST.get('name'),
pin=int(request.POST.get('pin')),
password=request.POST.get('pin')
)
data.save()
messages.add_message(request, messages.SUCCESS,
'New Employee Added Successfuly')
context = {
'object_list': Employee.objects.filter(department__institute=request.user.institute),
'form': EmployeeForm(request.user.institute.id)
}
return render(request, 'employee.html', context=context)
Formularz:
class EmployeeForm(forms.ModelForm):
class Meta:
model = Employee
fields = '__all__'
exclude = ['create', 'update', 'admin', 'user']
widgets = {
'date_of_birth': forms.DateInput(attrs={'type': 'date'}),
}
def clean_name(self):
name = self.cleaned_data.get('name')
if RiverTimeUser.objects.filter(username=name).count() > 0:
raise ValidationError('This Employe Username is already in use.')
return name
def __init__(self, institute, *args, **kwargs):
super().__init__()
self.helper = FormHelper()
self.fields['designation'].queryset = Designation.objects.filter(institute_id=institute)
self.fields['department'].queryset = Department.objects.filter(institute_id=institute)
Edytowane pełne informacje o śledzeniu
Nie mogłem znaleźć dokładnego błędu
Traceback (most recent call last):
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\fields\__init__.py", line 1772, in get_prep_value
return int(value)
The above exception (int() argument must be a string, a bytes-like object or a number, not 'QueryDict') was the direct cause of the following exception:
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "C:\Users\riaju\Documents\atms\New folder\atms\custom\methods.py", line 24, in wrap
return view_func(request, *args, **kwargs)
File "C:\Users\riaju\Documents\atms\New folder\atms\user_maintenance\views.py", line 22, in employee_list
form = EmployeeForm(request.POST, request.FILES)
File "C:\Users\riaju\Documents\atms\New folder\atms\user_maintenance\forms.py", line 27, in __init__
self.fields['designation'].queryset = Designation.objects.filter(institute=institute)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\sql\query.py", line 1350, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\sql\query.py", line 1377, in _add_q
child_clause, needed_inner = self.build_filter(
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\sql\query.py", line 1311, in build_filter
condition = self.build_lookup(lookups, col, value)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\sql\query.py", line 1165, in build_lookup
lookup = lookup_class(lhs, rhs)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\lookups.py", line 22, in __init__
self.rhs = self.get_prep_lookup()
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\fields\related_lookups.py", line 115, in get_prep_lookup
self.rhs = target_field.get_prep_value(self.rhs)
File "C:\Users\riaju\Documents\atms\venv\lib\site-packages\django\db\models\fields\__init__.py", line 1774, in get_prep_value
raise e.__class__(
Exception Type: TypeError at /employee/
Exception Value: Field 'id' expected a number but got <QueryDict: {'csrfmiddlewaretoken': ['vfO31XU2Y8x9MBzfUZ7rnq4widBlrt2uu6aF63ZorSW9DO6Rv8gjNE72SIN0YY1p'], 'name': ['Training'], 'designation': ['1'], 'department': ['1'], 'phone': ['12345'], 'date_of_birth': ['2020-12-31'], 'card_number': ['124'], 'pin': ['1234']}>.
2 odpowiedzi
Twój problem dotyczy metody __init__
. Podałeś pierwszy argument institute
, dlatego musisz przekazać instytutowi żądania GET i POST.
def employee_list(request):
if request.POST and request.FILES:
form = EmployeeForm(request.user.institute, request.POST, request.FILES)
Po drugie, musisz zdać *args
i **kwargs
, kiedy dzwonisz super().__init__
:
def __init__(self, institute, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.fields['designation'].queryset = Designation.objects.filter(institute_id=institute)
self.fields['department'].queryset = Department.objects.filter(institute_id=institute)
Alternatywnym podejściem jest zamiast tego wyskoczenie institute
z kwargów. Oznacza to, że nie zmieniasz podpisu metody __init__
.
def __init__(self, *args, **kwargs):
institute = kwargs.pop('institute')
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.fields['designation'].queryset = Designation.objects.filter(institute_id=institute)
self.fields['department'].queryset = Department.objects.filter(institute_id=institute)
Jeśli to zrobisz, zmień sposób tworzenia wystąpienia formularza na:
def employee_list(request):
if request.POST and request.FILES:
form = EmployeeForm(request.POST, request.FILES, institute=request.user.institute)
...
context = {
'object_list': Employee.objects.filter(department__institute=request.user.institute),
'form': EmployeeForm(institute=request.user.institute.id)
}
Twój rzeczywisty błąd ma postać metody __init__
:
self.fields['designation'].queryset = Designation.objects.filter(institute=institute)
, gdzie institute
wydaje się być polem PK lub FK i zamiast tego przekazujesz zestaw zapytań w filtrze.
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.