2016-07-14 16 views
0

Ich habe ein Modell mit dem Namen Space und es hat ein Feld mit dem Namen guest, und das Feld ist ein Choicefield, das eine einzelne Zahl nimmt, sagen wir 3 und speichern Sie es in der Datenbank. Ich habe ein anderes Modell Book und unter seinen Feldern ist no_of_persons.Schalten Sie ForeignKey-Objekte zu ChoicesField

Nun ist es mir möglich, die 'guest' Feldwert zu filtern, die '3' durch Book Modell ist und es als Drop-Down (1,2,3) zeigen, dass die Zahl nicht in guest Modell gespeichert überschreiten wird.?

Recall, guest wird als einstellige gespeichert. Ist es möglich, dass es ab der niedrigsten Nummer wie ein Dropdown angezeigt wird?

Ein gutes Beispiel dafür, was ich versuche zu tun, wie der Wert des Feldes ‚Gäste‘ auf Airbnb mit ‚Gästen‘ Feld in seinem ‚Buch‘ Modell entspricht.

enter image description here

UPDATE:

gibt es die folgenden Fehler nach dem Vorschlag von Todor versuchen.

coercing to Unicode: need string or buffer, int found 

Modelle

class Space(models.Model): 
    user= models.ForeignKey(User) 
    no_of_guest=models.CharField(max_length=30, choices=MAX_SPACE_CHOICES, verbose_name='no_of_guest') 
    #other fields 

    def __unicode__(self): 
     return '%s, %s, %s, %s, %s' % (self.user, self.id, self.name, self.address, self.no_of_guest) 

class BookSpace(models.Model): 
    user= models.ForeignKey(User) 
    space= models.ForeignKey(Space) 
    check_in_date= models.DateField() 
    check_out_date= models.DateField() 
    no_of_persons= models.CharField(max_length=10) 
    #other fields 

    def __unicode__(self): 
     return '%s, %s, %s' % (self.user, self.space, self.full_name) 

class BookSpaceForm(forms.ModelForm): 
    class Meta: 
     model= BookSpace 
     exclude=('#fields not needed') 

    def __init__(self, *args, **kwargs): 
     space= kwargs.pop('space') 
     super(BookSpaceForm, self).__init__(*args, **kwargs) 
     guest_choices= [(i, str(i)) for i in range(1, int(space.no_of_guest)+1)] 
     self.fields['no_of_persons'].widget= forms.ChoiceField(choices=guest_choices) 

Nach der Aktualisierung, ich bin

KeyError u'space‘ Ausnahme Location bekommen: models.py in init, Linie 202

Die Zeile lautet:

space= kwargs.pop('space') 

In meinen Ansichten:

def book_a_space(request, space_id): 
    space= Space.objects.get(pk=space_id) 
    if request.method=="POST": 
     form=BookSpaceForm(request.POST) 
     if form.is_valid(): 
      #other data and more 
     else: 
      print form.errors 

    else: 
     form=BookSpaceForm(space=space) 
     return render(request, 'spaceb/book_space_form.html', {'BookSpaceForm':BookSpaceForm}) 

In Vorlage:

{{ BookSpaceForm.as_p }} 

UPDATE:

noch die KeyError bekommen. Ich änderte die Modelle wie folgt aus:

def __init__(self, *args, **kwargs): 
    space_id= kwargs.pop('space_id') 
    super(BookSpaceForm, self).__init__(*args, **kwargs) 
    if space_id: 
     guest_choices = [(str(i), str(i)) for i in range(1, int(space_id.no_of_guest)+1)] 
     self.fields['no_of_persons'].widget = forms.ChoiceField(choices=guest_choices) 

Und in meinen Ansichten, ich habe

def book_a_space(request, space_id): 
     space= Space.objects.get(pk=space_id) 
     if request.method=="POST": 
      form=BookSpaceForm(request.POST) 
      if form.is_valid(): 
       #other data and more 
      else: 
       print form.errors 

     else: 
      context = { 
       'BookSpaceForm': BookSpaceForm(space_id=space_id), 
       'space_id': Space.objects.get(id=space_id) 
      } 
      return render(request, 'spaceb/book_space_form.html', context) 

Und ich bin immer diese Fehlermeldung:

'unicode' object has no attribute 'no_of_guest' 

Ich habe die Unicode in BookSpace Modelle zurück:

return '%s, %s, %s' % (self.user, self.space_id.no_of_guest, self.full_name) 

Noch .. immer noch die gleichen Unicode-Fehler.

Antwort

1

Sie können ein benutzerdefiniertes Formular Book erstellen, das eine guest Instanz zur Konstruktionszeit akzeptiert und das Widget für das Feld no_of_persons mit einem Auswahlfeld dynamisch ändert.

Eine beispielhafte Implementierung:

class BookForm(forms.ModelForm): 
    class Meta: 
     model = Book 
     fields = '__all__' 

    def __init__(self, *args, **kwargs): 
     space = kwargs.pop('space') 
     super(BookForm, self).__init__(*args, **kwargs) 
     guest_choices = [(str(i), str(i)) for i in range(1, int(space.no_of_guest)+1)] 
     self.fields['no_of_persons'].widget = forms.Select(choices=guest_choices) 


#sample usage 
def book_a_space(request, space_id): 
    space = Space.objects.get(pk=space_id) 
    if request.method == "POST": 
     form = BookSpaceForm(request.POST, space=space) 
     if form.is_valid(): 
      #other data and more 
     else: 
      print form.errors 
    else: 
     form = BookSpaceForm(space=space) 

    return render(request, 'spaceb/book_space_form.html', { 
     'form': form, 
     'space': space, 
    }) 
+0

Danke für die Antwort. Das Hauptproblem besteht darin, das 3 in Dropdown wie (1,2,3) zu ändern. Ich finde es, um herauszufinden, wie es geht. – YoYo

+0

@YoYo Ich habe meine Antwort mit einem Beispielbeispiel aktualisiert, hoffe es hilft. – Todor

+0

Ich bekomme diesen Fehler: Coercing nach Unicode: brauche Zeichenfolge oder Puffer, Int in dieser Zeile gefunden guest_choices = [(i, str (i)) für i in Bereich (1, space.guest + 1)] Ich habe versucht guest_choices = [(i, int (str (i))) für i im Bereich (1, sharedcrib.no_of_guest + 1)] noch immer der gleiche Fehler – YoYo