2011-01-28 5 views
1

J'ai une page de paramètres qui a deux formes pour gérer les paramètres pour deux modèles différents. Le formulaire de modèle de profil fonctionne. Le formulaire de modèle Chef ne le fait pas. Le formulaire échoue gracieusement, et ne lance pas une page d'erreur Django - donc en utilisant pdb, j'ai trouvé le formulaire n'est pas valide, et lance une erreur de syntaxe.Django: SyntaxError 'EOF' inattendu lors de l'enregistrement d'un formulaire

Je suis confus quant à quel champ cette erreur vient forme. Toute aide serait grandement appréciée. Merci!

Erreur:

*** SyntaxError: SyntaxError('unexpected EOF while parsing', ('<string>', 0, 0, '')) 

HTML

{% if form.is_multipart %} 
    <form enctype="multipart/form-data" method="post" action=".">{% csrf_token %} 
    {% else %} 
<h3>Profile Settings</h3> 
    <form method="post" action="."> 
    {% endif %} 
    <dl> 
     <dt>{{form.photo.label}}</dt> 
     <dd>{{form.photo}}</dd> 
     <dt>{{form.firstname.label}}</dt> 
     <dd>{{form.firstname}}</dd> 
     <dt>{{form.lastinitial.label}}</dt> 
     <dd>{{form.lastinitial}}</dd> 
    </dl> 
    <button type="submit">Save</button> 
</form> 


<h3>Chef Settings</h3> 
<form action="{% url edit_chef chef.id %}" method="post" accept-charset="utf-8">{% csrf_token %} 
<dl> 
    <dt>{{chefform.category.label}}</dt> 
    <dd>{{chefform.category}}</dd> 
    <dt>{{chefform.price.label}}</dt> 
    <dd>{{chefform.price}}</dd> 
    <dt>{{chefform.meal.label}}</dt> 
    <dd>{{chefform.meal}}</dd> 
    <dt>{{chefform.language.label}}</dt> 
    <dd>{{chefform.language}}</dd> 
    <dt>{{chefform.address.label}}</dt> 
    <dd>{{chefform.address}}</dd> 
    <dt>{{chefform.neighborhood.label}}</dt> 
    <dd>{{chefform.neighborhood}}</dd> 
    <dt>{{chefform.city.label}}</dt> 
    <dd>{{chefform.city}}</dd> 
    <dt>{{chefform.state.label}}</dt> 
    <dd>{{chefform.state}}</dd>  
    <dt>{{chefform.menu.label}}<span id="rBann" class="minitext">1000</span></dt> 
    <dd>{{chefform.menu}}</dd> 
</dl> 
<button type="submit">Save</button> 
</form> 

Chef de formulaire

class ChefForm(forms.ModelForm): 
    class Meta: 
    model = Chef 
    fields = ('category','meal','price','language','address','neighborhood','city','state', 'country', 'menu') 

    category = forms.ChoiceField(
     label=_("Food style"), 
     choices=([('Afghan','Afghan'),('African','African'),('American','American'),]), 
            required=True) 

    meal = forms.ModelMultipleChoiceField(
     label=_("What is your best meal?"), 
     queryset=Meal.objects.all(), 

            required=True) 

    price = forms.IntegerField(
     label=_("Price per person"), 
     widget=forms.TextInput(), 
            required=True) 

    language = forms.ModelMultipleChoiceField(
     label=_("Languages spoken"), 
     queryset=Language.objects.all(), 
            required=True) 

    address = forms.CharField(
     label=_("Your Address"), 
     widget=forms.TextInput(), 
            required=True) 

    neighborhood = forms.CharField(
     label=_("Your Neighborhood"), 
     widget=forms.TextInput(), 
            required=True) 

    city = forms.CharField(
     label=_("Your City"), 
     widget=forms.TextInput(), 
            required=True) 

    state = forms.CharField(
     label=_("Your state"), 
     widget=forms.TextInput(), 
            required=True) 

    country = forms.CharField(
     label=_("Your country"), 
     widget=forms.TextInput(), 
            required=True)         

    menu = forms.CharField(
     label=_("What's unique about your cooking & home? Pets? Have a family or roommates?"), 
     widget=forms.TextInput(), 
            required=True) 

    def __init__(self, *args, **kwargs): 
     super(ChefForm, self).__init__(*args, **kwargs) 
     self.fields['price'].widget.attrs = { 
     'placeholder':'10'} 
     self.fields['menu'].widget.attrs = { 
     'placeholder':'Tacos!'} 

Vue:

@login_required 
def edit_chef(request, chef_id, template_name="chef/newchef.html"): 

    chef = get_object_or_404(Chef, id=chef_id) 
    if request.user != chef.cook: 
    return HttpResponseForbidden() 
    if request.method == 'POST': 
    import pdb; pdb.set_trace() 
    chefform = ChefForm(request.POST, instance=chef) 
    if chefform.is_valid(): 
     chefform.save() 
     return HttpResponseRedirect('/users/%d/' % request.user.id) 
    else: 
     return HttpResponseRedirect('/users/%d/' % request.user.id) 
    data = { "chef":chef, 
    "chefform":chefform } 
    return render_to_response(template_name, 
          data, 
          context_instance=RequestContext(request)) 

Pour ajouter plus d'informations à ce bogue, j'ai pu tirer cette erreur de tuyau cassé:

[29/Jan/2011 09:20:24] "POST /chef/1/edit/ HTTP/1.1" 200 104804 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 281, in run 
    self.finish_response() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 321, in finish_response 
    self.write(data) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 400, in write 
    self.send_headers() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 464, in send_headers 
    self.send_preamble() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 382, in send_preamble 
    'Date: %s\r\n' % http_date() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 322, in write 
    self.flush() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 301, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 32] Broken pipe 
---------------------------------------- 
Exception happened during processing of request from ('127.0.0.1', 53340) 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 284, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 310, in process_request 
    self.finish_request(request, client_address) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 323, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 562, in __init__ 
    BaseHTTPRequestHandler.__init__(self, *args, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 641, in __init__ 
    self.finish() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 694, in finish 
    self.wfile.flush() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 301, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 32] Broken pipe 
---------------------------------------- 
[29/Jan/2011 09:20:27] "GET /users/2/ HTTP/1.1" 200 114593 
+0

Qu'est-ce que vous tapez exactement dans PDB pour obtenir cette erreur? créez cette erreur si vous exécutez une commande d'impression pdb sans argument .. –

+0

Ne pas attendre que 'si chefform.is_valid():' puis imprimer l'erreur – Emile

+0

Pourquoi obtenez-vous tous les attributs manuellement à partir du modèle 'nettoyé_données'? point d'un modelform est que vous pouvez simplement faire 'chefform.save' et obtenez une instance de modèle prête à l'emploi basée sur votre formulaire. –

Répondre

0

SyntaxError :: SyntaxError vient de l'analyseur Python lui-même. Je ne pense pas que cela ait quelque chose à voir avec vos données de formulaire.

Je vais essayer d'exécuter pylint, pyflakes ou pep8 compliance sur ce code et voir ce qu'il dit.

Je soupçonne une erreur d'analyse de l'un de vos fichiers Python, peut-être une partie de l'un des fichiers qui est montré ci-dessus, mais pas exactement ce que vous avez là. Par exemple, un caractère errant (ou [ou {quelque part peut provoquer ce type de problème, car le code de formulaire n'est pas exécuté avant d'être appelé.)

L'indentation impaire de vos parties "required = True" de la déclaration de ChefForm Votre éditeur est indentation incorrecte en raison d'un problème, probablement au-dessus de la déclaration entière de "classe ChefForm" que nous ne pouvons pas voir ici

0

EDIT: désolé je ne me trompe pas avec ma dernière réponse. Je pensais à autre chose.

% s remplacer avec% d sur cette ligne:

return HttpResponseRedirect('/users/%s' % request.user.id) 
+0

Ah merci Andre pour ce bug ... mais ne l'a pas réparé: / – Emile