我正在使用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集合中的条目),我需要餐馆的参考对象。我怎么能得到它?
答案 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
希望这是你所需要的。如果我完全错过了你的观点,请告诉我