A] Özet:olsun veya çok sayıda django model ve modelforms
almak veya bir rekor ya da ilişki yeni eklemeden önce var olup olmadığını kontrol etmek, birçok django modelleri birinde işlevsellik eklemek kullanma bir.
B] Detayları:
1] I (birçok) City aşağıdaki Django model yapısı ülkeyi (bir) sahip
2] ben html sayfasındaki formu görüntülemek için ModelForm kullanıyorum . Formlar şablon değerleri olarak iletilir ve şablon değerleri daha sonra html sayfasında görüntülenir.
3] Gönderme isteği geldiğinde, kod ülke ve şehir formu verilerini ayıklar, geçerliliği denetler ve kaydeder.
1]
2] Temelde, orada olup olmadığını kontrol etmek istiyorum ülkem ve şehir ilişkisi get_or_insert işlevselliğini kullanmak istiyorum:
C] Sayı/Ürün i yardıma ihtiyacım Kullanıcı tarafından seçilen ülke için mevcut bir ülke kaydında, ülke için
2.1] seçilen ülke için bir şehir kaydı olup olmadığını kontrol edin.
2.1.1] şehir rekor varsa, biz iyi, başka bir rekora
2.1.2] şehir rekor yoksa, şehir kaydı oluşturun ekleyebilir ve ülkeyi ilişkilendirmek gerek ülke mevcut değilse, ülke kaydını oluşturun, şehir kaydını oluşturun ve şehir kaydını ülke kayıtlarıyla ilişkilendirin.
Cı] Kod alıntılar:
1] modelleri ve şekilleri -
class UserReportedCountry(db.Model):
country_name = db.StringProperty(required=True,
choices=['Afghanistan','Aring land Islands']
)
class UserReportedCity(db.Model):
country = db.ReferenceProperty(UserReportedCountry, collection_name='cities')
city_name = db.StringProperty(required=True)
class UserCountryForm(djangoforms.ModelForm):
class Meta:
model = UserReportedCountry
class UserCityForm(djangoforms.ModelForm):
class Meta:
model = UserReportedCity
exclude = ('country',)
forms-- user_country_form ve user_city_form baskılar
2] kodu python kodundan şablon değerleri
__TEMPLATE_USER_COUNTRY_FORM = 'user_country_form'
__TEMPLATE_USER_CITY_FORM = 'user_city_form'
def get(self):
template_values = {
self.__TEMPLATE_USER_COUNTRY_FORM: UserCountryForm(),
self.__TEMPLATE_USER_CITY_FORM: UserCityForm()
}
#rendering the html page and passing the template_values
self.response.out.write(template.render(self.__MAIN_HTML_PAGE, template_values))
html sayfasındaki şablon değerlerini görüntüler 3] HTML kodunu alıntı
<div id="userDataForm">
<form method="POST" action="/UserReporting">
<table>
<!-- Printing the forms for users country, city -->
{{ user_country_form }}
{{ user_city_form }}
</table>
<input type="submit" name="submit" value= "submit">
</form>
</div>
verilerin kaydedilmesi için 3] Kod alıntı - Okumak için
def post(self):
self.store_user_data()
self.redirect('/')
#method to save users data in the models UserReportedCountry, UserReportedCity
def store_user_data(self):
#getting user's country and city
user_reported_country = UserCountryForm(self.request.POST)
user_reported_city = UserCityForm(self.request.POST)
if (user_reported_country.is_valid() and user_reported_city.is_valid()):
#save the country data
country_entity = user_reported_country.save()
#save the city data, and relate county with city
city_entity = user_reported_city.save(commit=False)
city_entity.country = country_entity
city_entity.put()
return
else:
return
Teşekkür .
[Düzenle # 1] Torsten'in @
sonrası bana get_or_insert bir gösterici verdi Sonra http://stackoverflow.com/questions/4812832/get-or-create-matching (StackOverflow yazı geldi
def store_user_data(self):
#getting user's country and city
user_reported_country = UserCountryForm(self.request.POST)
user_reported_city = UserCityForm(self.request.POST)
if (user_reported_country.is_valid() and user_reported_city.is_valid()):
#save the country and city data
country_record = self.store_country_data()
city_record = self.store_city_data(country_record)
return
else:
return
def store_country_data(self):
user_reported_country_name = self.request.POST['country_name']
key_name = self.sanitize_key_name(user_reported_country_name)
country_entity = UserReportedCountry.get_or_insert(key_name, country_name = user_reported_country_name)
country_entity.put()
return country_entity
def store_city_data(self, country_record):
user_reported_city_name = self.request.POST['city_name']
key_name = self.sanitize_key_name("%s:%s" % (country_record.country_name, str(user_reported_city_name)))
city_entity = UserReportedCity.get_or_insert(key_name,
city_name = user_reported_city_name,
country= country_record)
city_entity.put()
return city_entity
def sanitize_key_name(self,key_name):
return re.sub(r'\s', '', key_name.lower())
İstek:: birisi hızlı bir kod yapabilir miyiz lütfen aşağıdaki gibi -tuşu-ve-kullanıcı piton-app-motor) ve kayıt tasarruf için kullanıcı get_or_insert
Code KEY_NAME işlevselliği uygulanan görünüyor yanlış bir şey yapıyorum ya da Çaylak kurabiye hataları?
Tümü. Sorun nedir? Ne sıkıntın var? –
Üzgünüz için @Nick Johnson, Üzgünüz. Soru çok ayrıntılı olduğu için bölüm adını "Yardım/Öğe ile yardıma ihtiyacım var" olarak değiştirdi. – bhavesh