从django中的HTML模板获取mongodb元素的ObjectID

时间:2016-04-02 19:46:01

标签: python django mongodb django-forms django-templates

我正在使用Python + MongoDB(MongoEngine)进行基于预留的简单应用程序。

该应用程序有两种型号:餐厅和预订。

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)

预订有一个餐馆的ReferenceField。 [内部使用DBRef的MongoEngine]

现在,当我呈现餐馆列表时,我必须提供与每家餐馆相对应的预订选项。在与餐馆列表相对应的Django模板中,我已经包含了餐厅元素的所有三个字段: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 %}

`{%endblock%}

现在,如果用户点击保留,我需要创建一个表单(使用CreateView和Forms.Forms of Django)。

但问题是要保存表单数据(即MongoDB的Reservation集合中的条目),我需要餐馆的参考对象。我怎么能得到它?

1 个答案:

答案 0 :(得分:0)

我有一段时间没有使用MongoDB,但我相信你的问题与MongoDB无关,所以我将回答你如何在创建另一个(预订)时获得对一个记录(餐馆)的引用。

您没有显示{{ restaurant.get_reserve_url }}是什么,但一般来说,您有三种选择:

1.-您在表单中添加一个字段以让用户进入餐厅(通过下拉或自动完成),但我通常是一个糟糕的用户体验。

2.-您将引用作为URL参数传递给餐馆:

/reservation/add/?restaurant=abc

3.-您将该引用作为URL的一部分传递给餐馆:

/restaurant/abc/reservation/add/

使用2或3时,您的CreateView必须从URL中提取餐馆ID并获取引用以将其设置为表单上的隐藏值。

这是一个如何从参数(2)中获取它的示例,但它几乎相同(3)只有你从kwargs而不是request获取餐馆ID .GET:

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

希望这是你所需要的。如果我完全错过了你的观点,请告诉我