【问题标题】:Getting ObjectID of mongodb elements from HTML template in django从 Django 中的 HTML 模板获取 mongodb 元素的 ObjectID
【发布时间】:2016-04-02 19:46:01
【问题描述】:

我正在将 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)

Reservations 有一个指向餐厅的 ReferenceField。 [MongoEngine 在内部使用 DBRef]

现在,当我渲染餐厅列表时,我必须提供与每家餐厅相对应的预订选项。在与 List of Restaurants 对应的 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 %}

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

但问题是要保存表单数据(即 MongoDB 的 Reservation 集合中的条目),我需要餐厅的引用对象。我怎样才能得到它?

【问题讨论】:

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


    【解决方案1】:

    我有一段时间没有使用 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.GET 获取餐厅 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多