2016-04-10 40 views
1

Ben django-autocomplete-light kullanarak bu garip hatayı alıyorum: "Geçerli bir seçim yapın. Bu seçim kullanılabilir seçeneklerden biri değil. ." Ancak, aynı sayfada kalırsam ve tekrar Gönder'e basarsam, formda sorun yaratmaz ve formdaki veriler olması gerektiği gibi veritabanına eklenir."Geçerli bir seçim yap" hatası sadece ilk gönderiminde django-autocomplete-light'i kullanmayı deneyin

Başka bir Modelden eklenebilir satırlarla gömülü bir formum var. Bu modeller ile aynı BookSumbission sayfasında ve her bir Miktarı belirtilen her bir Kitap için birden fazla farklı Kitabın (ForeignKey aracılığıyla başka bir Kitap Modeline işaret ettiği) bir BookSubmission yapabilirim.

Pencere öğesi etkin olmadığında her şey iyi çalışıyor. Beklenen listeden bir veya daha fazla kitap seçebilirim. Widget'ı etkinleştirirseniz, her şey iyi çalışıyor gibi görünür, widget da beklenen Kitapları gösterir. Ancak, gönderirseniz hatayı alırım. Tekrar gönder düğmesine basın ve form kusursuz bir şekilde gönderilir.

Burada neler olup bittiği hakkında bir fikri olan var mı? Belki de .js dosyalarının yükleme sırası ile ilgili bir şey olduğunu düşündüm, ama onunla uğraşmak bana hiç sonuç vermedi.

models.py

class BookSubmission(models.Model): 
    SubmissionTitle = models.CharField(
            max_length=6, 
            verbose_name="Submission Title", 
            unique=True) 
    SubmissionText = models.TextField(
            max_length=1500, 
            null=True, 
            blank=True, 
            verbose_name="Submission Text" 
            ) 


class BooksAndQuantity(models.Model): 
    Submission = models.ForeignKey(
            'Submission', 
            null=True, 
            blank=True, 
            verbose_name="BookSubmission" 
            ) 
    Book = models.ForeignKey(
           'Books', 
           to_field='BookTitle', 
           db_column='BookTitleID', 
           null=True, 
           blank=True, 
           ) 
    Quantity = models.FloatField(verbose_name="Quantity") 


class Books(models.Model): 
    BookTitle = models.CharField(
            max_length=6, 
            unique=True, 
            db_column='BookTitleID') 
    BookText = models.TextField(
            max_length=1500, 
            null=True, 
            blank=True 
           ) 

forms.py

class BookSubmissionForm(forms.ModelForm): 
    class Meta: 
     model = BookSubmission 
     fields = '__all__' 

BookAndQuantityFormset = inlineformset_factory(
    BookSubmission, 
    BookAndQuantity, 
    fields='__all__', 
    extra=1, 
    widgets={'Book': 
      autocomplete.ModelSelect2(url='BookAutocomplete')}) 

views.py aşağıdaki html dosyalarına ile

class BookSubmissionView(generic.CreateView): 
    template_name = 'BookSubmission.html' 
    model = BookSubmission 
    form_class = BookSubmissionForm 
    success_url = 'success/' 

    def get(self, request, *args, **kwargs): 
     """ 
     Handles GET requests and instantiates blank versions of the form 
     and its inline formsets. 
     """ 
     self.object = None 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     BookAndQuantityForm = BookAndQuantityFormset() 
     return self.render_to_response(
      self.get_context_data(form=form, 
            BookAndQuantityForm=BookAndQuantityForm)) 

    def post(self, request, *args, **kwargs): 
     """ 
     Handles POST requests, instantiating a form instance and its inline 
     formsets with the passed POST variables and then checking them for 
     validity. 
     """ 
     self.object = None 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     BookAndQuantityForm = BookAndQuantityFormset(self.request.POST) 
     if (form.is_valid() and BookAndQuantityForm.is_valid()): 
      return self.form_valid(form, BookAndQuantityForm) 
     else: 
      return self.form_invalid(form, BookAndQuantityForm) 

    def form_valid(self, form, BookAndQuantityForm): 
     """ 
     Called if all forms are valid. Creates a Recipe instance along with 
     associated Ingredients and Instructions and then redirects to a 
     success page. 
     """ 
     self.object = form.save() 
     BookAndQuantityForm.instance = self.object 
     BookAndQuantityForm.save() 
     specieandquantityout_form.instance = self.object 
     specieandquantityout_form.save() 
     return HttpResponseRedirect(self.get_success_url()) 

    def form_invalid(self, form, BookAndQuantityForm): 
     """ 
     Called if a form is invalid. Re-renders the context data with the 
     data-filled forms and errors. 
     """ 
     return self.render_to_response(
      self.get_context_data(form=form, 
            BookAndQuantityForm=BookAndQuantityForm)) 


class BookAutocomplete(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     # Don't forget to filter out results depending on the visitor ! 
     # if not self.request.user.is_authenticated(): 
     # return Specie.objects.none() 

     qs = Books.objects.all() 

     if self.q: 
      qs = qs.filter(BookTitle__istartswith=self.q) 

     return qs 

:

Parent.html

<head> 
    {% load staticfiles %} 
    <link rel="stylesheet" href="{% static 'personal/css/bootstrap.min.css' %}" type = "text/css"/> 
    <link rel="stylesheet" href="{% static 'personal/css/navbar-fixed-top.css' %}" > 
    <link rel="stylesheet" href="{% static 'personal/assets/ie10-viewport-bug-workaround.css' %}" > 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
    <meta name="viewport" content = "width=device-width, initial-scale=1.0"> 
    <script src="{% static 'personal/assets/ie10-viewport-bug-workaround.js' %}"></script> 
    <script src="{% static 'personal/js/bootstrap.min.js' %}"></script> 

    <style type="text/css"> 
     html, 
     body { 
      height:100% 
     } 
    </style> 

</head> 

BookSubmission.html

{% extends "parent.html" %} 
{% load staticfiles %} 

{% block content %} 
    <div> 
     <h1>Add BookSubmissionForm</h1> 
     <form action="" method="post"> 
      {% csrf_token %} 
      <div> 
       <p> BookSubmission Title {{ form.SubmissionTitle }} </p> 
       <p> BookSubmission Text {{ form.SubmissionText }} </p> 
      </div> 
      <fieldset> 
       <legend>Book and Quantity</legend> 
       {{ bookandquantity_form.management_form }} 
       {{ bookandquantity_form.non_form_errors }} 
       {% for form in bookandquantity_form %} 
        {{ form.id }} 

        <div class="inline {{ bookandquantity_form.prefix }}"> 
         {{ form.Book.errors }} 
         {{ form.Book.label_tag }} 
         {{ form.Book }} 
         {{ form.Quantity.errors }} 
         {{ form.Quantity.label_tag }} 
         {{ form.Quantity }} 
        </div> 
       {{ form.media }} 
       {% endfor %} 
      </fieldset> 
      <input type="submit" value="Add BookSubmission" class="submit" /> 
     </form> 
    </div> 

{% endblock %} 

{% block footerContent %} 
    <script src="{% static 'MM/js/jquery.formset.js' %}"></script> 
    <script type="text/javascript"> 
     $(function() { 
      $(".inline.{{ bookandquantity_form.prefix }}").formset({ 
       prefix: "{{ bookandquantity_form.prefix }}", 
      }) 
     }) 
    </script> 
{% endblock %} 

urls.py

url(r'^BookAutoComplete/$', 
    views.BookAutoComplete.as_view(), 
    name='BookAutoComplete'), 

düzenlemek başka ne garip şu, ben başka Ekle" itme ilk kez

"formda bu görünüyor. Aşağıdaki resimde aynı Formset iki kez eklenmiştir (şimdi "Türler ve Quanity" olarak adlandırılır. & Çıkış).

"Farklı Türler" i tıklamaksızın "Türler ve Miktar İçindekiler" ifadesi görüntülendiğinde "Tür ve Miktar Çıkışı" bölümünde "Başka Ekle" yi tıklattım ve ilk satırın buggy olduğunu görebiliyorsunuz. satır boş bir işe yaramaz alan eklenir.

screenshot

+0

BookAutocomplete URL'si ve görünümü tanımlandı? – jpic

+0

'BookAndQuantityForm = KitapAndQuantityFormset (self.request.POST) if (form.is_valid() ve BookAndQuantityForm.is_valid():' bu nedir? – jpic

+0

Üzgünüz, bu yazıya her şeyi koymadım. bölüm – ThomasKlont

cevap

0

Formunuz doğrulama kodu formu doğrulamaz, bu yüzden yanlıştır.

Şüpheniz varsa otomatik tamamlama aracı olmadan deneyin.

Ayrıntılar için bkz. Django forms documentation.

+0

Tamam. Gelecek haftaya dalıp sana döneceğim. Teşekkürler! – ThomasKlont