代码之家  ›  专栏  ›  技术社区  ›  Jhnsbrst

类型as_p工作正常,但单个表单字段提交不正确

  •  0
  • Jhnsbrst  · 技术社区  · 4 年前

    我已通过使用表单导入表单来设置模板。和以前一样,它很好用。但是,我需要指定每个字段,因为我有一个不希望用户看到的字段(我需要在django admin中有它,所以我不能将其从表单中排除)。

    然而,当我使用表单的各个字段设置表单并提交它时,我不会被重定向,我只会返回到已填写的表单。

    我已经设置了许多打印字段,也尝试以表单_invalid打印,但没有显示任何内容,我不知道问题出在哪里。有人能建议如何解决这个问题,或者用另一种方法解决它吗?

    模板中的表单

    <form method="post" enctype="multipart/form-data" id="adForm" data-municipalities-url="{% url 'ajax_load_municipalities' %}" data-areas-url="{% url 'ajax_load_areas' %}" novalidate>
        {% csrf_token %}  
    
        <!-- {{ form.as_p }} -->
    
        {{ form.non_field_errors }}
    
        <div class="fieldWrapper">
          {{ form.province.errors }}
          {{ form.province.label_tag }}
          {{ form.province }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.municipality.errors }}
          {{ form.municipality.label_tag }}
          {{ form.municipality }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.area.errors }}
          {{ form.area.label_tag }}
          {{ form.area }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.name.errors }}
          {{ form.name.label_tag }}
          {{ form.name }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.age.errors }}
          {{ form.age.label_tag }}
          {{ form.age }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.title.errors }}
          {{ form.title.label_tag }}
          {{ form.title }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.description.errors }}
          {{ form.description.label_tag }}
          {{ form.description }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.days_per_week.errors }}
          {{ form.days_per_week.label_tag }}
          {{ form.days_per_week }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.hundras.errors }}
          {{ form.hundras.label_tag }}
          {{ form.hundras }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.size_offered.errors }}
          {{ form.size_offered.label_tag }}
          {{ form.size_offered }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.image1.errors }}
          {{ form.image1.label_tag }}
          {{ form.image1 }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.image2.errors }}
          {{ form.image2.label_tag }}
          {{ form.image2 }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.image3.errors }}
          {{ form.image3.label_tag }}
          {{ form.image3 }}
        </div>
    
        <div class="fieldWrapper">
          {{ form.payment_type.errors }}
          {{ form.payment_type.label_tag }}
          {{ form.payment_type }}
        </div>
    
    
    
        <button type="submit">Publicera annons</button>
    
      </form>
    

    风景

    class NewAdTakeMyDog(CreateView):
        model = Advertisement
        form_class = NewAdTakeMyDogForm
        template_name = 'core/advertisement_form_take.html'
        success_url = reverse_lazy('view_ads_take_my_dog')
    
        def __init__(self):
            print('init')
            self.pk = None
    
    
        def form_valid(self, form):
            print('Form valid')
            form.instance.author = self.request.user
            form.instance.is_offering_own_dog = True
            form.instance.is_published = False
            response = super().form_valid(form)
            return response
    
        def get_success_url(self):
            print('Get success url')
            if self.object.payment_type == 'S':
                return reverse('swish_payment_template', kwargs={'pk': self.object.pk})
            if self.object.payment_type == 'B':
                return reverse('bg_payment', kwargs={'pk': self.object.pk})
    

    形式。py

    class NewAdTakeMyDogForm(forms.ModelForm):
        
        CHOICES = [('S',f'Swish - {PRICE_SWISH}'),('B',f'Bankgiro - {PRICE_BANKGIRO}')]
        payment_type = forms.CharField(label='Betalsätt', widget=forms.RadioSelect(choices=CHOICES))
    
        hundras = forms.ModelChoiceField(
            queryset=DogBreeds.objects.all(),
            widget=autocomplete.ModelSelect2(url='breed-autocomplete')
        )
    
        class Meta:
            model = Advertisement
            fields = ('author', 'province', 'municipality', 'area', 'title', 'name', 'age', 'description', 'days_per_week', 'size_offered', 'hundras', 'image1', 'image2', 'image3', 'payment_type')
    
    
        def __init__(self, *args, **kwargs):
            super(NewAdTakeMyDogForm, self).__init__(*args, **kwargs)
            self.fields['municipality'].queryset = Municipality.objects.none()
            self.fields['area'].queryset = Area.objects.none()
            self.fields['area'].required = False
    
            if 'province' in self.data:
                try:
                    # Set municipality queryset
                    province_id = int(self.data.get('province'))
                    self.fields['municipality'].queryset = Municipality.objects.filter(province_id=province_id).order_by('name')
                
                    # Set area queryset
                    municipality_id = int(self.data.get('municipality'))
                    self.fields['area'].queryset = Area.objects.filter(municipality_id=municipality_id).order_by('name')
                    
    
                except (ValueError, TypeError) as e:
                    pass # invalid input from the client; ignore and fallback to empty Municipality/Area queryset
              
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Jhnsbrst    4 年前

    我最终解决了这个问题,创建了一个额外的表单,用于管理界面。

    此外,我还通过使用以下工具获得了酥脆的表单:

    {{form|crispy}}
    

    而不是:

    {% crispy form %}