2012-08-03 7 views
5

Ich habe das ein paar Stunden lang angeschaut und ich kann nicht verstehen, warum ich diese Nachricht bekomme.django - int argument muss eine Zeichenfolge oder eine Zahl sein, nicht 'Tuple'

int() argument must be a string or a number, not 'tuple' 

auf dieser Linie von meinem views.py. (Hinweis: Ausnahme occurrs tatsächlich eine Ebene tiefer in django Kern, aber das ist mein Codezeile, die schließlich die Ausnahme auslöst) ...

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

Warum erhalte ich diesen Fehler? Zu Ihrem Vorteil finden Sie unten models.py, ein forms.py und ein Snippet von views.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 ...

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 

relevent Code von views.py:

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

Wenn ich eine Schätzung wetten müsste, würde ich sagen, dass ein Tupel an int() übergeben wird und keine Zeichenfolge oder Nummer. – Lanaru

Antwort

12

get_or_create gibt ein Tupel in Form von (instance, created). Der zweite Parameter sagt Ihnen, ob er es erstellen musste oder nicht, offensichtlich genug. Führen Sie stattdessen folgende Schritte aus:

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

Sehr seltsam. Ich hätte gedacht, dass, wenn Sie sagen "client = ...", anstatt "client, created = ...", wäre der 2. "Rückgabewert" (des Tupels) einfach verloren gegangen. Dann wieder, ich bin ein Noob in Python :) –

+0

Nein, weil der Rückgabewert ein Tupel ist, so dass das gesamte Tupel in der Variablen gespeichert wird. Die Komma-getrennte Liste der Variablennamen ist ein bisschen Magie, die dem Python-Parser sagt, dass er den Rückgabewert (der vermutlich ein Tupel ist) erweitert und die Werte in den jeweiligen Variablen speichert. –

Verwandte Themen