2016-04-02 18 views
0

私はPython + MongoDB(MongoEngine)を使って簡単な予約ベースのアプリケーションを作成しています。djangoのHTMLテンプレートからmongodb要素のObjectIDを取得する

アプリケーションには、レストランと予約の2つのモデルがあります。

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) 

予約にはレストランへの参照フィールドがあります。 [DBRefを内部で使用するMongoEngine]

今、レストランのリストをレンダリングするとき、各レストランに対応する予約のオプションを与える必要があります。レストランのリストに対応して提供されるDjangoテンプレートでは、レストラン要素の3つのフィールドすべてが含まれています:restaurant.id restaurant.nameとrestaurant.location。

以下は、レストランリストに対応するテンプレートです。ユーザが予約をクリックした場合

{% 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 %} 

`{%の末端ブロック%}

は今、私は(CREATEVIEWとDjangoのforms.Formsを使用して)フォームを作成する必要があります。

しかし、フォームデータ(MongoDBのReservationコレクションのエントリ)を保存するには、レストランの参照オブジェクトが必要です。どうすれば入手できますか?

答えて

0

私はしばらくMongoDBを使っていませんが、あなたの質問はMongoDBとは関係がないと思いますので、別の(予約)を作成するときに、レコード(レストラン)を参照する方法についてお答えします。

あなたは何であるか{{ restaurant.get_reserve_url }}表示されていないが、一般的に、次の3つのオプションがあります。

1.-あなたは、ユーザがレストランに入る持つようにフォームにフィールドを追加します(を経由して、ドロップダウンまたはオートコンプリート)しかし、私は通常、悪いUXです。

2.- URLの引数としてあなたがレストランへの参照を渡す:あなたはURLの一部として、レストランへの参照を渡す

/reservation/add/?restaurant=abc 

3.-:

/restaurant/abc/reservation/add/ 

付き2または3のいずれかを選択すると、CreateViewはURLからレストランIDを抽出し、フォーム上に隠れた値として設定するための参照を取得する必要があります。ここで

は、引数(2)からそれを取得する方法の例ですが、(3)だけではなくrequest.GETのkwargsからから店舗IDを取得するためにそれはほとんど同じです:

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 

あなたのフォームは次のようなものになります

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 

希望はあなたの希望です。私があなたの意見を完全に忘れてしまったら教えてください

関連する問題