2015-05-01 32 views
5

Come indicato nel titolo, l'attributo segnaposto nei widget del modulo non viene visualizzato correttamente. È casuale, a volte funziona bene e a volte ho bisogno di aggiornare il browser per farli mostrare. Ne ho bisogno perché non sto mostrando le etichette di campo nel modello. Comunque ecco il codice:Il segnaposto del form in django non viene mostrato correttamente

#FORMS.PY 
class RegistrationForm(UserCreationForm): 
    first_name = forms.CharField(label=_('First name'), max_length=30) 
    last_name = forms.CharField(label=_('Last name'), max_length=30) 
    email = forms.EmailField(label=_("Email"), required=True) 

    class Meta: 
     model = User 
     fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2') 

    def __init__(self, *args, **kwargs): 
     super(RegistrationForm, self).__init__(*args, **kwargs) 
     # Set field Label as Placeholder for every field 
     for field in self.base_fields.values(): 
      field.widget.attrs["placeholder"] = field.label 
     # Set HTML and CSS attributes to the fields 
     self.fields['username'].widget.attrs.update({'class':TEXTINPUT_CSS}) 
     self.fields['email'].widget.attrs.update({'class':EMAILINPUT_CSS}) 
     self.fields['password1'].widget.attrs.update({'class':PASSWORDINPUT_CSS}) 
     ... 

Tra l'altro sto usando server di sviluppo Django, il problema potrebbe venire dal fatto che il server è lento. Qualsiasi aiuto sarebbe apprezzato

Edit: Views.py e modello come richiesto

#views.py 
def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      if REGISTER_EMAIL_CONFIRMATION == True: 
       # Add email confirmation 
       username = form.cleaned_data['username'] 
       email = form.cleaned_data['email'] 
       salt = hashlib.sha1(str(random.random()).encode('utf-8')).hexdigest()[:5]    
       activation_key = hashlib.sha1((salt+email).encode('utf-8')).hexdigest()    
       key_expires = datetime.datetime.today() + datetime.timedelta(CONFIRMATION_KEY_EXPIRE_DAYS) 
       # Create and save User Profile 
       user=User.objects.get(username=username)    
       new_profile = UserProfile(user=user, activation_key=activation_key, key_expires=key_expires) 
      new_profile.save() 
       # Send email with activation key 
       subject_file = 'app_authentication/email_signup_confirm_subject.txt' 
       body_file = 'app_authentication/email_signup_confirm_body.html' 
       context = {'username':username, 'activation_key':activation_key} 
       send_email_from_files([email], subject_file, body_file, context) 
       return redirect('confirm_email_sent') 
      else: 
       return redirect('register_success') 
    else: 
     form = RegistrationForm() 
    return render(request, 'registration/register.html', {'form': form, 'title': _('Register')}) 


#register.html 
{% block content2 %} 
<form id="register_form" autocomplete="off" method="post" action="{% url 'register' %}"> 
{% csrf_token %} 
    <div class="clearfix"> 
    {% for field in form %} 
     <div class="form-group"> 
      {{ field }} 
      {% if form.errors %} 
      {% for error in field.errors %} 
       <div class="alert alert-error"> 
        <strong>{{ error|escape }}</strong> 
       </div> 
      {% endfor %} 
      {% endif %} 
     </div> 
    {% endfor %} 
     {% if form.errors %} 
     {% for error in form.non_field_errors %} 
      <div class="alert alert-error"> 
       <strong>{{ error|escape }}</strong> 
      </div> 
     {% endfor %} 
     {% endif %} 
    </div> 
    <!-- Send Button --> 
    <div class="pt-10"> 
     <button class="submit_btn btn btn-mod btn-medium btn-round btn-full" id="reg-btn" name="submit">{{ title }}</button> 
    </div> 
</form> 
{% endblock content2 %} 

Screenshots:

Quando avvio il server di sviluppo e cercare di login: placeholders not working

stessa pagina di accesso dopo l'aggiornamento del browser: placeholders working after refresh

@akarilimano:

class LoginForm(AuthenticationForm): 
    # username doesn't have label in AuthenticationForm 
    username = forms.CharField(label=_("Username"), max_length=254) 

    def __init__(self, *args, **kwargs): 
     super(LoginForm, self).__init__(*args, **kwargs) 
     # Set field Label as Placeholder for every field 
     for field in self.base_fields.values(): 
      print(field.label) 
      field.widget.attrs['placeholder'] = field.label 
+0

Cosa uscita stai ricevendo in segnaposto? Sembra che dovrebbe funzionare finora. – Mikeec3

+0

Sto ottenendo il risultato previsto (le etichette vengono utilizzate come segnaposto) ma lo ottengo solo 7 volte su 10. Quando non funziona ottengo campi di moduli vuoti (nessun segnaposto). Ho lo stesso problema anche in un modulo di login con lo stesso codice. –

+0

@khalilan quelle sono schermate per pagina di login, la pagina di registrazione ha gli stessi problemi? Puoi fornire il codice (moduli, viste) anche per il login? – akarilimano

risposta

3

tenta di modificare base_fields qui:

for field in self.base_fields.values(): 

a fields:

for field in self.fields.values(): 

base_fields dizionario è l'insieme di base di campi definiti per la classe. Puoi cambiarlo ma non è raccomandato e nel tuo caso non è necessario.

penso che la versione potrebbe funzionare se si chiama super dopo aver cambiato base_fields:

def __init__(self, *args, **kwargs): 
    for field in self.base_fields.values(): 
     field.widget.attrs["placeholder"] = field.label 
    super(RegistrationForm, self).__init__(*args, **kwargs) 
+1

funziona perfettamente. Grazie mille ! –

1

Perché avete bisogno di questo codice, se sono stati definiti in model = UserMeta?

first_name = forms.CharField(label=_('First name'), max_length=30) 
last_name = forms.CharField(label=_('Last name'), max_length=30) 
email = forms.EmailField(label=_("Email"), required=True) 

Forse sono entrati in conflitto con i campi modello? Puoi provare a rimuovere i campi del modulo non di modello?

+0

Li ho usati in precedenza per aggiungere i segnaposti e ho dimenticato di commentarli 'first_name = forms.CharField (label = _ ('Nome'), max_length = 30, widget = forms.TextInput (attrs = {'segnaposto': 'Nome'}}) ' Io li rimuoverò e controllo subito –

+0

quando eseguo il server e vado a il sito Web e prova ad accedere o iscriversi ai segnaposto non mostrare la prima volta, vengono visualizzati solo dopo l'aggiornamento. Ma una volta lì sono sempre mostrati, quindi è un miglioramento. –

+0

@KhalilAn puoi provare a sostituire 'field.widget.attrs [" placeholder "] = field.label' con' field.widget.attrs.update ({'placeholder': field.label}) '? Oppure prova a spostare il ciclo 'for' alla fine di' __init() __ '. – akarilimano

3

Prova definire i segnaposto direttamente come widget di attributi come:

class RegistrationForm(UserCreationForm): 
     first_name = forms.CharField(label=_('First name'), max_length=30, widget=forms.TextInput(attrs={"placeholder": "First name"})) 
     last_name = forms.CharField(label=_('Last name'),max_length=30, widget=forms.TextInput(attrs={"placeholder": "Last Name"})) 
     email = forms.EmailField(label=_("Email"), required=True, widget=forms.TextInput(attrs={"placeholder": "Email"})) 
+0

Sono sicuro che il tuo suggerimento funzioni, ma cercavo una risposta più ASCIUTTA. (+1) –

+0

@KhalilAn Suppongo che usiamo solo attributo segnaposto HTML. – ofnowhere