Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 表单提交时,将变量从views.py传递到forms.py会导致错误_Python_Django - Fatal编程技术网

Python 表单提交时,将变量从views.py传递到forms.py会导致错误

Python 表单提交时,将变量从views.py传递到forms.py会导致错误,python,django,Python,Django,我已经将一些变量从视图传递到表单,以使用它过滤表单中的一些字段。但是当我点击表单中的submit按钮时,它给出了一个错误 KeyError at /add_ad/mod/ 'cat' 以下是错误的完整回溯: Traceback: File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner 35.

我已经将一些变量从视图传递到表单,以使用它过滤表单中的一些字段。但是当我点击表单中的submit按钮时,它给出了一个错误

KeyError at /add_ad/mod/
'cat'
以下是错误的完整回溯:

Traceback:

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\lito\Desktop\DJ\JEHLUM - Copy - Copy\web_site\views.py" in add_ad_mod
  210.         add_ad_mod_form = AddAdModForm(request.POST, request.FILES)

File "C:\Users\lito\Desktop\DJ\JEHLUM - Copy - Copy\web_site\forms.py" in __init__
  47.         current_categ = kwargs.pop('cat')

Exception Type: KeyError at /add_ad/mod/
Exception Value: 'cat'
以下是我在文件中使用的代码:

视图.py

def add_ad_mod(request):
    current_user = request.user
    current_ip = get_client_ip(request)
    selected  = Temp.objects.filter(created_by_ip=current_ip).order_by('-created_at')[0]
    selected_category = selected.cat
    selected_town = selected.town
    add_ad_mod_form = AddAdModForm(cat=selected_category, loc=selected_town)
    if request.method == 'POST':
        add_ad_mod_form = AddAdModForm(request.POST, request.FILES)
        if add_ad_mod_form.is_valid():
            model_instance = add_ad_mod_form.save(commit=False)
            model_instance.created_by = current_user.email
            model_instance.category = selected_category
            model_instance.town=selected_town
            if request.user.is_superuser:
                model_instance.is_active = True
            else:
                model_instance.is_active = False
            add_ad_mod_form.save()
            return redirect('dashboard')
    else:
        add_ad_mod_form = AddAdModForm(cat=selected_category, loc=selected_town)

    context = {
        'add_ad_mod_form': add_ad_mod_form,
        'selected_category': selected_category,
        'selected_town': selected_town,
    }
    return render(request, 'add_ad_mod.html', context)
class AddAdModForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        current_categ = kwargs.pop('cat')
        current_loc = kwargs.pop('loc')
        super(AddAdModForm, self).__init__(*args, **kwargs)
        self.fields['sub_category'] = forms.ChoiceField(label="Sniffer", choices=[(x, x) for x in
                                                                          SubCate.objects.filter(main_category=current_categ)])
        self.fields['sub_location'] = forms.MultipleChoiceField (widget=forms.CheckboxSelectMultiple,label="Sniffer", choices=[(x, x) for x in
                                                                          SubLoc.objects.filter(main_town=current_loc)])

    title = forms.CharField(
        widget=forms.TextInput(
            attrs={
                'placeholder': 'Ad Title here',
                'style': 'width: 100%; max-width: 800px;'
            }
        )
    )

    description = forms.CharField(
        widget=forms.Textarea(
            attrs={
                'placeholder': 'Ad description is here',
                'style': 'width: 100%; max-width: 800px;'
            }
        )
    )

    image = forms.ImageField(required=True)
    image2 = forms.ImageField(required=False)
    image3 = forms.ImageField(required=False)
    image4 = forms.ImageField(required=False)
    image5 = forms.ImageField(required=False)



    address = forms.CharField(max_length=100,
        widget=forms.Textarea(
            attrs={
                'placeholder': 'Detailed Address is here ',
                'style': 'width: 100%; max-width: 800px;'
            }
        )
    )

    class Meta:
        model = Item
        fields = ['title', 'sub_category', 'price', 'description', 'sub_location', 'address', 'image', 'image2', 'image3', 'image4',
                  'image5', 'phone']
Forms.py

def add_ad_mod(request):
    current_user = request.user
    current_ip = get_client_ip(request)
    selected  = Temp.objects.filter(created_by_ip=current_ip).order_by('-created_at')[0]
    selected_category = selected.cat
    selected_town = selected.town
    add_ad_mod_form = AddAdModForm(cat=selected_category, loc=selected_town)
    if request.method == 'POST':
        add_ad_mod_form = AddAdModForm(request.POST, request.FILES)
        if add_ad_mod_form.is_valid():
            model_instance = add_ad_mod_form.save(commit=False)
            model_instance.created_by = current_user.email
            model_instance.category = selected_category
            model_instance.town=selected_town
            if request.user.is_superuser:
                model_instance.is_active = True
            else:
                model_instance.is_active = False
            add_ad_mod_form.save()
            return redirect('dashboard')
    else:
        add_ad_mod_form = AddAdModForm(cat=selected_category, loc=selected_town)

    context = {
        'add_ad_mod_form': add_ad_mod_form,
        'selected_category': selected_category,
        'selected_town': selected_town,
    }
    return render(request, 'add_ad_mod.html', context)
class AddAdModForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        current_categ = kwargs.pop('cat')
        current_loc = kwargs.pop('loc')
        super(AddAdModForm, self).__init__(*args, **kwargs)
        self.fields['sub_category'] = forms.ChoiceField(label="Sniffer", choices=[(x, x) for x in
                                                                          SubCate.objects.filter(main_category=current_categ)])
        self.fields['sub_location'] = forms.MultipleChoiceField (widget=forms.CheckboxSelectMultiple,label="Sniffer", choices=[(x, x) for x in
                                                                          SubLoc.objects.filter(main_town=current_loc)])

    title = forms.CharField(
        widget=forms.TextInput(
            attrs={
                'placeholder': 'Ad Title here',
                'style': 'width: 100%; max-width: 800px;'
            }
        )
    )

    description = forms.CharField(
        widget=forms.Textarea(
            attrs={
                'placeholder': 'Ad description is here',
                'style': 'width: 100%; max-width: 800px;'
            }
        )
    )

    image = forms.ImageField(required=True)
    image2 = forms.ImageField(required=False)
    image3 = forms.ImageField(required=False)
    image4 = forms.ImageField(required=False)
    image5 = forms.ImageField(required=False)



    address = forms.CharField(max_length=100,
        widget=forms.Textarea(
            attrs={
                'placeholder': 'Detailed Address is here ',
                'style': 'width: 100%; max-width: 800px;'
            }
        )
    )

    class Meta:
        model = Item
        fields = ['title', 'sub_category', 'price', 'description', 'sub_location', 'address', 'image', 'image2', 'image3', 'image4',
                  'image5', 'phone']
我看到错误出现在行
current\u categ=kwargs.pop('cat')
中,但我无法找出原因

更新

根据下面的答案,我发现了错误

Traceback:

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\lito\Desktop\DJ\JEHLUM - Copy - Copy\web_site\views.py" in add_ad_mod
  219.             add_ad_mod_form.save()

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\forms\models.py" in save
  457.             self._save_m2m()

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\forms\models.py" in _save_m2m
  439.                 f.save_form_data(self.instance, cleaned_data[f.name])

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\related.py" in save_form_data
  1619.         getattr(instance, self.attname).set(data)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\related_descriptors.py" in set
  969.                     self.add(*new_objs)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\related_descriptors.py" in add
  898.                 self._add_items(self.source_field_name, self.target_field_name, *objs)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\related_descriptors.py" in _add_items
  1045.                             '%s__in' % target_field_name: new_ids,

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\query.py" in filter
  836.         return self._filter_or_exclude(False, *args, **kwargs)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\query.py" in _filter_or_exclude
  854.             clone.query.add_q(Q(*args, **kwargs))

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in add_q
  1253.         clause, _ = self._add_q(q_object, self.used_aliases)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in _add_q
  1277.                     split_subq=split_subq,

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in build_filter
  1215.         condition = self.build_lookup(lookups, col, value)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\sql\query.py" in build_lookup
  1085.         lookup = lookup_class(lhs, rhs)

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\lookups.py" in __init__
  18.         self.rhs = self.get_prep_lookup()

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\related_lookups.py" in get_prep_lookup
  59.                 self.rhs = [target_field.get_prep_value(v) for v in self.rhs]

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\related_lookups.py" in <listcomp>
  59.                 self.rhs = [target_field.get_prep_value(v) for v in self.rhs]

File "C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_value
  947.         return int(value)

Exception Type: ValueError at /add_ad/mod/
Exception Value: invalid literal for int() with base 10: 's'
回溯:
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\core\handlers\exception.py”位于内部
35响应=获取响应(请求)
获取响应中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\core\handlers\base.py”
128response=self.process\u异常\u由\u中间件(e,请求)
获取响应中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\core\handlers\base.py”
126响应=包装的回调(请求,*回调参数,**回调参数)
文件“C:\Users\lito\Desktop\DJ\JEHLUM-Copy-Copy\web\u site\views.py”位于add\u ad\u mod中
219添加广告修改表单保存()
保存中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\forms\models.py”
457self._save_m2m()
保存m2m中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\forms\models.py”
439f、 保存表单数据(self.instance、已清理的表单数据[f.name])
保存表单数据中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\fields\related.py”
1619getattr(实例,self.attname).set(数据)
集合中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\fields\related\u descriptors.py”
969self.add(*new_objs)
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\fields\related\u descriptors.py”
898self.\添加\项(self.source\字段\名称、self.target\字段\名称、*objs)
添加项中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\fields\related\u descriptors.py”
1045.                             '%“%target\u field\u name:new\u id”中的s\u,
过滤器中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\query.py”
836返回self.\u filter\u或\u exclude(False、*args、**kwargs)
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\query.py”位于\u filter\u或\u exclude
854clone.query.add_q(q(*args,**kwargs))
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\sql\query.py”
1253子句,self.\u添加(q\u对象,self.used\u别名)
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\sql\query.py”位于\u add\u q
1277split_subq=split_subq,
内置过滤器中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\sql\query.py”
1215条件=self.build\u查找(查找、列、值)
生成查找中的文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\sql\query.py”
1085lookup=lookup\u类(左、右)
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\lookups.py”位于\uu init中__
18self.rhs=self.get\u prep\u lookup()
get\u prep\u lookup中的文件“C:\Users\lito\AppData\Local\Programs\Python 37-32\lib\site packages\django\db\models\fields\related\u lookups.py”
59self.rhs=[target_field.get_prep_value(v)for v in self.rhs]
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\fields\related\u lookups.py”
59self.rhs=[target_field.get_prep_value(v)for v in self.rhs]
文件“C:\Users\lito\AppData\Local\Programs\Python\Python37-32\lib\site packages\django\db\models\fields\\ uuuuuu init\ uuuuuu.py”位于get\u prep\值中
947返回int(值)
异常类型:ValueError位于/add\u ad/mod/
异常值:基数为10的int()的文本无效:“s”

您已经告诉代码需要参数
cat
loc
,但是您只是从GET块中的视图传递它们,而不是从POST块中传递。你需要两次都通过

add_ad_mod_form = AddAdModForm(request.POST, request.FILES, cat=selected_category, loc=selected_town)
(注意,在
if
语句之前有一个不必要的额外实例化;您应该删除它。)

编辑正如我在评论中提到的,您不应该对关系使用基本选择字段

self.fields['sub_category'] = forms.ModelChoiceField(label="Sniffer", queryset=SubCate.objects.filter(main_category=current_categ))
self.fields['sub_location'] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, label="Sniffer", queryset=SubLoc.objects.filter(main_town=current_loc))

您已经告诉代码需要参数
cat
loc
,但您只是从GET块中的视图传递它们,而不是从POST块传递它们。你需要两次都通过

add_ad_mod_form = AddAdModForm(request.POST, request.FILES, cat=selected_category, loc=selected_town)
(注意,在
if
语句之前有一个不必要的额外实例化;您应该删除它。)

编辑正如我在评论中提到的,您不应该对关系使用基本选择字段

self.fields['sub_category'] = forms.ModelChoiceField(label="Sniffer", queryset=SubCate.objects.filter(main_category=current_categ))
self.fields['sub_location'] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, label="Sniffer", queryset=SubLoc.objects.filter(main_town=current_loc))

add\u ad\u mod\u form=AddAdModForm(request.POST,request.FILES)
中,不传递
cat
参数。与
loc
相同。在
add\u ad\u mod\u form=AddAdModForm(request.POST,request.FILES)
中,您不传递
cat
参数。与
loc
相同。太好了,我没有注意到。但是现在我得到了一个错误
invalid literal for int(),以10为基数:“l”
,这对我来说是完全不可理解的!!你需要发布完整的回溯。虽然您可能应该使用
表单