2012-08-03 10 views
5

मैं इसे कुछ घंटों तक देख रहा हूं और मुझे यह संदेश नहीं मिल रहा है कि मुझे यह संदेश क्यों मिल रहा है .. ।django - int तर्क एक स्ट्रिंग या संख्या होना चाहिए, न कि 'टुपल'

int() argument must be a string or a number, not 'tuple' 
मेरी views.py से इस लाइन पर

(नोट: अपवाद वास्तव में एक स्तर गहरी अंदर Django कोर occurrs, लेकिन कोड है जो अंत में अपवाद चलाता है की यह मेरी लाइन) ...

service_interest = ServiceInterest.objects.get_or_create(service = service, client = client) 

मुझे यह त्रुटि क्यों मिल रही है? अपने लाभ के लिए, models.py, form.py, और scen.py से एक स्निपेट नीचे देखें।

models.py:

class Client(models.Model): 
    name = models.CharField(max_length=100) 
    email = models.EmailField() 
    site = models.URLField() 
    contact_date = models.DateField(default = datetime.date.today()) 

class Service(models.Model): 
    name = models.CharField(max_length=200) 

class ServiceInterest(models.Model): 
    service = models.ForeignKey('Service') 
    client = models.ForeignKey('Client') 

    class Meta: 
    unique_together = ("service", "client") 

forms.py ... views.py से

class ContactForm(forms.Form): 


SERVICE_CHOICES = (
    ('first_choice', 'Description of first choice'), 
    ('second_choice', 'Description of second choice'), 
    ('third_choice', 'Description of third choice'), 
    ('other', 'Other') 
) 

    SERVICE_CHOICES_DICT = dict(SERVICE_CHOICES) 

    name = forms.CharField(label='What would you like us to call you?', max_length=200, required=False) 
    email = forms.EmailField(label='What is your email address?', help_text='Ex: [email protected]') 
    url = forms.URLField(label='If you have a website, please provide a link', required=False, help_text="Ex: www.yoursite.com") 
    service_interest = forms.MultipleChoiceField(label="Please check all of the services you're interested in:", widget=forms.widgets.CheckboxSelectMultiple, choices=SERVICE_CHOICES, required=True) 
    other = forms.CharField(label='If you selected \"Other\", please specify:', max_length=200, required=False) 
    message = forms.CharField(max_length=10000, required=False, label='Any other information you think we should know?', widget=forms.widgets.Textarea) 

    def clean_other(self): 
    cleaned_data = super(ContactForm, self).clean() 
    if 'service_interest' in cleaned_data.keys(): 
     options = cleaned_data['service_interest'] 
     if 'other' in options: 
     other_input = cleaned_data['other'] 
     if other_input == None or len(other_input) == 0: 
      raise forms.ValidationError('Required when \"Other\" is checked') 

    return cleaned_data 

प्रासंगिक कोड:

name = form.cleaned_data['name'] 
    email = form.cleaned_data['email'] 
    url = form.cleaned_data['url'] 
    interests = form.cleaned_data['service_interest'] 
    other = form.cleaned_data['other'] 
    message = form.cleaned_data['message'] 

    client = Client.objects.get_or_create(name = name, email = email, site = url) 
    for interest in interests: 
    service = None 
    if(interest != 'other'): 
     service = Service.objects.get_or_create(name = ContactForm.SERVICE_CHOICES_DICT[interest]) 
    else: 
     service = Service.objects.get_or_create(name = other) 

    # Appears to be responsible for the stack trace, even though exception 
    # is one level deeper in... 
    # /Library/Python/2.7/site-packages/django/core/handlers/base.py in get_response 
    service_interest = ServiceInterest.objects.get_or_create(service = service, client = client) 
+3

अगर मुझे अनुमान लगाना पड़ा, तो मैं कहूंगा कि ऐसा इसलिए है क्योंकि एक tuple int(), और स्ट्रिंग या संख्या में नहीं जा रहा है। – Lanaru

उत्तर

12

get_or_create एक टपल देता है, के रूप में (instance, created) का। दूसरा पैरामीटर आपको बताता है कि क्या इसे स्पष्ट करना पर्याप्त है या नहीं। इसके बजाय निम्न कार्य करें:

client, created = Client.objects.get_or_create(name = name, email = email, site = url) 
+0

बहुत अजीब। मैंने सोचा होगा कि यदि आप 'ग्राहक = ...' के बजाय 'क्लाइंट = बनाया गया' कहते हैं, तो बनाया गया ... ..., दूसरा 'वापसी मूल्य' (ट्यूपल का) बस खो गया होगा। फिर फिर, मैं पायथन में नोब हूं :) –

+0

नहीं, क्योंकि वापसी मूल्य एक ट्यूपल है, इसलिए संपूर्ण ट्यूपल चर में संग्रहीत है। कॉमा-डिलीमिटेड वेरिएबल नेम लिस्ट जादू का एक छोटा सा है जो पाइथन पार्सर को रिटर्न वैल्यू (जिसे टुपल की तरह कुछ माना जाता है) का विस्तार करने के लिए बताता है और मूल्यों को संबंधित चर में स्टोर करता है। –