2012-08-03 16 views
5

He estado mirando esto por un par de horas y parece que no puedo entender por qué estoy recibiendo este mensaje ... .El argumento django - int debe ser una cadena o un número, no 'Tuple'

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

en esta línea de mi views.py (NOTA: excepción realidad occurrs un nivel más profundo dentro del núcleo de Django, pero mi línea de código que finalmente desencadena la excepción) ...

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

¿Por qué me sale este error? Para su beneficio, vea debajo de models.py, un forms.py, y un fragmento de 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 ... código

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 

relevante de 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

Si tuviera que apostar, diría que es porque una tupla se está pasando a int(), y no a una cadena o un número. – Lanaru

Respuesta

12

get_or_create devuelve una tupla, en la forma de (instance, created). El segundo parámetro te dice si tuvo que crearlo o no, obviamente. Haga lo siguiente en su lugar:

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

Muy raro. Hubiera pensado que si dices 'client = ...', en lugar de 'client, created = ...', el segundo 'valor de retorno' (de la tupla) se habría perdido. Por otra parte, soy un novato en Python :) –

+0

No, porque el valor de retorno es una tupla, por lo que toda la tupla se almacena en la variable. La lista de nombres de variables delimitada por comas es un poco mágico que le dice al analizador de Python que amplíe el valor de retorno (que se supone que es algo así como una tupla) y almacena los valores dentro de las variables respectivas. –

Cuestiones relacionadas