क्या पायथन में एक स्ट्रैसिंग () समतुल्य है, और क्या मैं एक db.Model तत्व को स्ट्रिंग में बदल सकता हूँ?


87

मैं पायथन के साथ खुद को शुरू करने में मदद करने के लिए एक ToDo सूची ऐप लिख रहा हूं। एप्लिकेशन GAE पर चल रहा है और मैं डेटा स्टोर में टूडू आइटम संग्रहीत कर रहा हूं। मैं हर किसी के आइटम को उन्हें और उन्हें अकेले प्रदर्शित करना चाहता हूं। समस्या यह है कि ऐप वर्तमान में सभी उपयोगकर्ताओं के लिए सभी आइटम प्रदर्शित करता है, इसलिए मैं देख सकता हूं कि आप क्या लिखते हैं, और आप देखते हैं कि मैं क्या लिखता हूं। मैंने सोचा कि मेरे todo.author ऑब्जेक्ट को एक स्ट्रिंग में डालना और यह देखना कि क्या यह उपयोगकर्ता के नाम से मेल खाता है, एक अच्छी शुरुआत होगी, लेकिन मैं यह पता नहीं लगा सकता कि यह कैसे करना है।

मेरे मेनफ्रेम में यही है

... 
user = users.get_current_user()

if user:
    nickname = user.nickname()
    todos = Todo.all()
    template_values = {'nickname':nickname, 'todos':todos}
...

def post(self):

    todo = Todo()
    todo.author = users.get_current_user()
    todo.item = self.request.get("item")
    todo.completed = False

    todo.put()      
    self.redirect('/')

मेरे index.html में मेरे पास मूल रूप से यह था:

<input type="text" name="item" class="form-prop" placeholder="What needs to be done?" required/>
...
 <ul>
{% for todo in todos %}
  <input type="checkbox"> {{todo.item}} <hr />
{% endfor %}
</ul>

लेकिन मैं केवल उन उपयोगकर्ता को आइटम दिखाना चाहूँगा जिन्होंने उन्हें बनाया था। मैंने कोशिश करने की सोची

{% for todo in todos %}
    {% ifequal todo.author nickname %}
  <input type="checkbox"> {{todo.item}} <hr />
    {% endifequal %}
{% endfor %}

कोई फायदा नहीं। सूची रिक्त हो जाती है। मैंने मान लिया कि यह है क्योंकि todo.author एक स्ट्रिंग नहीं है। क्या मैं मान को स्ट्रिंग के रूप में पढ़ सकता हूं, या क्या मैं स्ट्रिंग को ऑब्जेक्ट डाल सकता हूं?

धन्यवाद!

संपादित करें: यहाँ मेरा टोडो वर्ग है

class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)

क्या मेरे लेखक को स्ट्रिंगरप्रॉपरि के लिए कुछ भी नकारात्मक रूप से बदलना होगा? शायद मैं पूरी तरह से कास्टिंग कर सकता हूं।

जवाबों:


92

अजगर में, str()विधि के समान है toString()अन्य भाषाओं में विधि। इसे एक पैरामीटर के रूप में स्ट्रिंग में बदलने के लिए ऑब्जेक्ट को पास करना कहा जाता है। आंतरिक रूप से यह __str__()अपने स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए पैरामीटर ऑब्जेक्ट की विधि को कॉल करता है।

इस मामले में, हालांकि, आप UserPropertyडेटाबेस से एक लेखक की तुलना कर रहे हैं , जो users.Userउपनाम स्ट्रिंग के साथ टाइप है । आप अपने टेम्पलेट के nicknameबजाय लेखक की संपत्ति की तुलना करना चाहेंगे todo.author.nickname


जवाब के लिए धन्यवाद। टेम्पलेट में str (todo.author) आज़माते समय मुझे निम्न त्रुटि हो रही है: TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'कोई विचार?
अमरू ई।

1
उद्धरणों को 'str(todo.author)'ऐसे ही लगाने की कोशिश करें। मैं Django टेम्प्लेट्स के साथ अनुभव नहीं कर रहा हूं, लेकिन ऐसा लगता है कि इसकी पार्सिंग तंत्र strफ़ंक्शन नाम के बाद कोष्ठक में लटका हुआ है । या आपको कॉल todo.author.nicknameकी आवश्यकता के बिना लेखक की स्ट्रिंग संपत्ति मिल सकती है, संभवतः ऐसा कुछ str()
जेफ लॉकहार्ट

मुझे अंत में यह काम करने के लिए मिला है! मैंने अपने if स्टेटमेंट में todo.author.nickname का उपयोग किया और जाँच की कि क्या मान वर्तमान उपयोगकर्ता के उपनाम से मेल खाता है। कृपया अपने उत्तर को शामिल करने के लिए संपादित करें ताकि मैं इसे स्वीकार कर सकूं।
अमरू ई।

35

पायथन में हम __str__()विधि का उपयोग कर सकते हैं ।

हम इसे अपनी कक्षा में इस तरह से ओवरराइड कर सकते हैं:

class User: 

    firstName = ''
    lastName = ''
    ...

    def __str__(self):
        return self.firstName + " " + self.lastName

और जब चल रहा है

print(user)

यह फ़ंक्शन को कॉल करेगा __str__(self) और पहले नाम और अंतिम नाम को प्रिंट करेगा


6

str() बराबर है।

हालाँकि आपको अपनी क्वेरी को फ़िल्टर करना चाहिए। फिलहाल आपकी क्वेरी all()टोडो की है।

todos = Todo.all().filter('author = ', users.get_current_user().nickname()) 

या

todos = Todo.all().filter('author = ', users.get_current_user())

टोडो मॉडल में जैसा कि आप लेखक को परिभाषित कर रहे हैं, उसके आधार पर। ए StringPropertyया UserProperty

नोट nicknameएक विधि है। आप विधि पारित कर रहे हैं न कि टेम्पलेट मानों में परिणाम।


जवाब के लिए धन्यवाद! मैं आगे बढ़ूंगा और अब फ़िल्टर को लागू करने का प्रयास करूंगा। मैं हालांकि उपनाम को लेकर थोड़ा भ्रमित हूं। मैंने पहले भी इसके साथ खेला है और मैं इसे किसी भी अन्य स्ट्रिंग की तरह हेरफेर करने में सक्षम था और इसे टेम्पलेट मूल्य के माध्यम से ठीक करता हूं। क्या मैं कुछ भूल रहा हूँ? ओह और लेखक एक UserProperty है। मैं इसे अपने मूल प्रश्न में जोड़ दूंगा।
अमरू ई।

मैं django टेम्प्लेट का उपयोग नहीं करता, इसलिए मुझे नहीं पता कि वे क्या करेंगे। कुछ टेम्प्लेटिंग सिस्टम स्वचालित रूप से कॉलिबल (उपनाम) ()
टिम हॉफमैन

क्या आप संक्षेप में समझाते हैं कि फ़िल्टर क्या करेगा? मुझे यकीन नहीं है कि मेरे todos = Todo.all () का वास्तविक कार्य क्या है।
अमरू ई।

जैसा कि आप एक्सैम्पल कोड से देख सकते हैं, फ़िल्टर एक क्वेरी तर्क है, विशेष रूप से लेखक संपत्ति = कुछ मूल्य। आप वास्तव में डॉक्स पढ़ने में कुछ समय बिताते हैं, यह आपको बहुत समय बचाएगा। Developers.google.com/appengine/docs/python/datastore डाटास्टोर के बारे में बात करता है और डेटा कैसे प्राप्त और डाल सकता है।
टिम हॉफमैन

2

आपको __unicode__अपने मॉडल पर विधि को परिभाषित करना चाहिए , और जब आप उदाहरण को संदर्भित करते हैं, तो टेम्पलेट इसे स्वचालित रूप से कॉल करेगा।


2

फ़ंक्शन पोस्ट में ():

todo.author = users.get_current_user()

तो, str (todo.author) प्राप्त करने के लिए, आपको str (users.get_current_user ()) की आवश्यकता है। Get_current_user () फ़ंक्शन द्वारा क्या लौटाया जाता है?

यदि यह एक वस्तु है, तो जांच करें कि इसमें एक str () फ़ंक्शन है?

मुझे लगता है कि त्रुटि वहां है।


user.get_current_user () उपयोगकर्ता के लिए एक पठनीय नाम प्रदान करने के लिए एक उपयोगकर्ता ऑब्जेक्ट देता है जिसका उपनाम () है। मुझे उपनाम सही ढंग से प्राप्त करने में समस्या हो रही थी, लेकिन मुझे यह समझ में आया। धन्यवाद!
अमरू ई।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.