2016-04-02 12 views
0

Ich benutze Python + MongoDB (MongoEngine) für eine einfache Reservierung basierte Anwendung.ObjectID von mongodb Elementen aus HTML-Vorlage in Django

Die Anwendung hat zwei Modelle: Restaurants und Reservierungen.

class Restaurant(Document): 
    name = StringField(max_length=200, required=True) 
    location = StringField(max_length=200, required=True) 

class Reservation(Document): 
    restaurant_id = ReferenceField(Restaurant, reverse_delete_rule=CASCADE) 
    time = IntField(min_value=1, required = True) 
    number_of_people = IntField(min_value=1, required = True) 

Reservierungen haben ein ReferenceField zu Restaurants. [MongoEngine mit DBRef intern]

Jetzt, wenn ich die Liste der Restaurants rendern, muss ich eine Option der Reservierung entsprechend jedem Restaurant geben. In der Django-Vorlage, die der Liste der Restaurants entspricht, habe ich alle drei Felder des Restaurantelements aufgenommen: restaurant.id restaurant.name und restaurant.location.

Im Folgenden ist die Vorlage Restaurant Liste.

{% extends "base.html" %} 
{% block content %} 
{% for restaurant in restaurant_list %} 
    <div style="margin-bottom: 20px;"> 
     <h4>{{ restaurant.name }}</h4> 
     <h4>{{ restaurant.location }}</h4> 
     <a href="{{ restaurant.get_reserve_url }}" class="btn btn-small">Reserve Table</a> 
    </div> 
{% endfor %} 

`{% endblock%}

Nun, wenn ein Benutzer auf Reserve klickt, muss ich ein Formular erstellen (mit Create und forms.Forms von Django).

Aber das Problem ist, dass zum Speichern der Formulardaten (d. H. Ein Eintrag in der Reservierung Sammlung von MongoDB) ich das Referenzobjekt des Restaurants benötigen. Wie kann ich das bekommen?

Antwort

0

Ich habe MongoDB seit einiger Zeit nicht mehr benutzt, aber ich glaube, dass Ihre Frage nichts mit MongoDB zu tun hat, also werde ich Ihnen antworten, wie Sie einen Verweis auf einen Datensatz (Restaurant) erhalten, wenn Sie einen anderen (Reservierung) erstellen.

Sie zeigen nicht, was {{ restaurant.get_reserve_url }} ist, aber im Allgemeinen, haben Sie drei Möglichkeiten:

1.- Sie ein Feld zum Formular hinzufügen die Benutzer haben das Restaurant betreten (via Drop-Down-oder Auto-complete) , aber ich habe normalerweise eine schlechte UX.

2.- Sie passieren den Verweis auf das Restaurant als URL-Argument:

/reservation/add/?restaurant=abc 

3.- Sie passieren den Verweis auf das Restaurant als Teil der URL:

/restaurant/abc/reservation/add/ 

Mit Entweder 2 oder 3, Ihr CreateView muss die Restaurant-ID aus der URL extrahieren und die Referenz erhalten, um sie als versteckten Wert im Formular festzulegen. Hier

ist ein Beispiel dafür, wie es bekommen von dem Argument (2), aber es ist fast das gleiche für (3) nur Sie das Restaurant-ID aus der kwargs statt request.GET erhalten:

class ResevationCreateView(CreateView): 
    model = Reservation 
    form_class = ReservationForm 
    template_name = 'form.html' 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     restaurant_id = form.cleaned_data.get('restaurant_id') 

     # ... Use restaurant to create new reservation 

     return HttpResponseRedirect(self.object.get_absolute_url()) 

    def get_form_kwargs(self): 
     kwargs = super(ResrvationCreateView, self).get_form_kwargs() 
     if 'restaurant' in self.request.GET: 
      restaurant_id = self.request.GET['restaurant'] 
      kwargs['restaurant'] = however_you_get_a_restaurant_obj(restaurant_id) 
     else: 
      kwargs['restaurant'] = None 

     return kwargs 

und Ihre Form wird so etwas wie

class ReservationForm(forms.Form): 
    restaurant_id = forms.IntegerField(required=False, widget=forms.HiddenInput()) 
    time = ... 
    number_of_people = ... 

    class Meta: 
     model = Reservation 
     fields = [...] 

    def __init__(self, restaurant, *args, **kwargs): 
     super(ReservationForm, self).__init__(*args, **kwargs) 

     if restaurant: 
      self.initial['restaurant_id'] = restaurant.id 

Hoffnung, dies ist das, was man braucht. Lassen Sie mich wissen, wenn ich Ihren Punkt vollständig verpasste

Verwandte Themen