Аргумент TypeError: int () должен быть строкой, байтовоподобным объектом или числом, а не QueryDict. - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь напечатать отфильтрованное раскрывающееся раскрытие sub_location в соответствии с расширенной формой администратора в Django. У меня есть представление, которое отображает форму и сохраняет ту же форму. Нет проблем с отображением представления, но при сохранении я получаю следующую ошибку:

Аргумент TypeError: int () должен быть строкой, байтовоподобным объектом или числом, а не QueryDict

Вот мой код: -

Модель:

class Location(models.Model):
    name = models.CharField(max_length=30)
    def __str__(self):
        return self.name

class SubLocation(models.Model):
    location = models.ForeignKey(Location, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class AdminProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True)

    def __str__(self):  # __unicode__ for Python 2
        return self.user.username


class Batch(models.Model):
    location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True)
    sub_location = models.ForeignKey(SubLocation, on_delete=models.SET_NULL, null=True)
    batch_name = models.CharField(max_length=30, unique=True)

    def __str__(self):
        return self.batch_name

FORM:

class BatchForm(forms.ModelForm):
    class Meta:
        model = Batch
        fields = ('sub_location', 'batch_name')
    def __init__(self, user, *args, **kwargs):
        super(BatchForm, self).__init__(*args, **kwargs)
        self.fields['sub_location'].queryset = SubLocation.objects.filter(location = Subquery(AdminProfile.objects.filter(user = user).values('location')))

ВИД:

def add_batch(request):
    if request.user.is_authenticated:
        msg = ""
        if request.method == "GET":
            batch_form = BatchForm(user=request.user)
        else:
            batch_form = BatchForm(request.POST, request.FILES)
            if batch_form.is_valid():
                try:
                    obj = batch_form.save(commit=False)
                    #logined admin location will be here

                    admin_object = AdminProfile.objects.filter(user = request.user)
                    obj.location = admin_object[0].location
                    obj.save()

                    batch_form = BatchForm()
                    msg = "Batch Added successfully....!"
                except IntegrityError as e:
                    msg= "Batch already exist...!"
            else:
                batch_form = BatchForm(request.POST, request.FILES)
        return render(request, 'add_new_batch.html', {'batch_form':batch_form,'msg':msg})
    else:
        return redirect('admin_login')

когда я нажимаю кнопку подтверждения, чтобы сохранить форму, я получаю эту ошибку
ERROR

Internal Server Error: /admin_panel/add_batch
Traceback (most recent call last):
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\monu\Desktop\Task\AdminPanel\views.py", line 34, in add_batch
    batch_form = BatchForm(request.POST, request.FILES)
  File "C:\Users\monu\Desktop\Task\AdminPanel\forms.py", line 27, in __init__
    self.fields['sub_location'].queryset = SubLocation.objects.filter(location = Subquery(AdminProfile.objects.filter(user = user).values('location')))
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\query.py", line 844, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\query.py", line 862, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\sql\query.py", line 1263, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\sql\query.py", line 1287, in _add_q
    split_subq=split_subq,
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\sql\query.py", line 1225, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\sql\query.py", line 1096, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\lookups.py", line 20, in __init__
    self.rhs = self.get_prep_lookup()
  File "C:\Users\monu\AppData\Local\Programs\Python\Python37\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\monu\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\fields\__init__.py", line 965, in get_prep_value
    return int(value)

TypeError: int() argument must be a string, a bytes-like object or a number, not 'QueryDict'
[25/Mar/2019 09:31:03] "POST /admin_panel/add_batch HTTP/1.1" 500 125516

1 Ответ

0 голосов
/ 25 марта 2019

Вы указали аргумент пользователя в методе init вашей формы.В паре, если ваши условия else вы не предоставляете этому пользователю при создании экземпляра формы:

else:
        batch_form = BatchForm(request.user,request.POST, request.FILES)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...