2011-04-06 18 views
5
için birini işlevsellik eklemek kullanma

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ı?

+0

Tümü. Sorun nedir? Ne sıkıntın var? –

+0

Ü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

cevap

0

kullanın get_or_create (sizin get_or_insert eşdeğeri): sorular beyanlardır gibi listelemek şeylerden

country, country_is_new = UserReportedCountry.objects.get_or_create(country_name=my_country_name) 
city, city_is_new = UserReportedCity.objects.get_or_create(country=country, city_name=my_city_name) 
+0

@Torsten, cevabınız için teşekkür ederim. Uygulama motoru API'sini aradım ve get_or_create uygulamasının google uygulama motoruyla desteklenmediğini tespit ettim. – bhavesh

+0

@Torsten, yazınız bana get_or_insert işlevselliği için bir işaretçi verdi ve stackoverflow üzerindeki anahtar adı gönderisine rastladım (http://stackoverflow.com/questions/4812832/get-or-create-matching-key-and-user- python-app-engine) ve orijinal yazımın "EDIT # 1" bölümünde işaret edilen kodu uyguladı. Bir kod incelemesi yapabilir ve herhangi bir hata yaptığımı bildirir misiniz? – bhavesh

+0

@lance_klusener, App Engine modellerini ve Django yerine onların sorgu API'sini kullanmak istediğinizi belirtmediniz. Sadece Django hakkında konuştuğunu varsayıyordum. Yine de modellerine göre bunu görmeliydim. : P –