2015-05-01 27 views
5

Başlıkta belirtildiği gibi, form widget'larındaki yer tutucu özniteliği düzgün gösterilmiyor. Rastgele, bazen iyi çalışıyor ve bazen göstermesi için tarayıcıyı yenilemem gerekiyor. Şablondaki alan etiketlerini göstermediğim için onlara ihtiyacım var. Neyse burada kodudur:django form yer tutucu düzgün göstermiyor

#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}) 
     ... 

i Django geliştirme sunucusu kullanıyorum Bu arada, sorun sunucu yavaş olmasından gelebilir.

i geliştirme sunucuyu başlatın ve giriş deneyin: placeholders not working

#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 %} 

Ekran istendiği gibi Views.py ve şablonu: Herhangi bir yardım

Edit mutluluk duyacağız

Tarayıcıyı yeniledikten sonra aynı giriş sayfası: 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

Eğer tutucuları ne çıktı alıyorsanız? Bu şimdiye kadar çalışması gerektiği gibi görünüyor. – Mikeec3

+0

Beklenen sonucu alıyorum (etiketler yer tutucu olarak kullanılıyor) ama ben sadece 7'den 7 kez çıkıyorum. Çalışmıyorsa boş form alanları (yer tutucu yok) alıyorum. Aynı sorunla aynı oturum açma formunda da aynı sorunu yaşıyorum. –

+0

@khalilan bunlar giriş sayfası için ekranlar, kayıt sayfası aynı sorunlara sahip mi? Giriş için de kod (form, görünüm) sağlayabilir misiniz? – akarilimano

cevap

3

burada base_fields değiştirmeye çalışın:

for field in self.base_fields.values(): 

fields için:

for field in self.fields.values(): 

base_fields Sözlük sınıf için belirlenen alanların taban kümesidir. Bunu değiştirebilir ancak tavsiye edilmez ve sizin durumunuzda gerekli değildir.

Sana base_fields değiştirdikten sonra super ararsanız sürümü çalışacak tahmin: Widget gibi niteliklerini doğrudan olarak

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

Works yer tutucu içermeyen lütfen unutmayın. Çok teşekkür ederim ! –

1

Neden Meta içinde model = User tanýmladýysanýz Bu kodu gerekiyor?

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) 

Model alanları ile çatışmaya girmiş olabilirler. Model olmayan form alanlarını kaldırmayı deneyebilir misiniz?

+0

Daha önce onları yer tutucuları eklemek için kullandım ve yorum yazmayı unuttum 'first_name = forms.CharField (label = _ ('Ad'), max_length = 30, widget = forms.TextInput (attrs = {'yer tutucu': 'İsim'})) ' Onları kaldıracağım ve gideceğim zaman –

+0

kontrol edip Web sitesi ve giriş yapmaya çalışın ya da kayıt tutmaya başladığınızda yer tutucuları ilk kez göstermiyorlar, sadece yeniledikten sonra gösteriliyorlar. Ama bir kez orada olduklarında her zaman gösterirler, bu yüzden bir gelişme. –

+0

@KhalilAn, "field.widget.attrs [" placeholder "] = field.label' yerine field.widget.attrs.update ({'placeholder': field.label})' ile değiştirmeyi deneyebilir misiniz? Veya 'for' döngüsünü __init() __ 'sonuna taşımaya çalışın. – akarilimano

3

sizin tutucuları tanımlayan deneyin:

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

Tavsiyenizin çalıştığından eminim, fakat daha çok KURU cevap arıyordum. (+1) –

+0

@KhalilAn Sanırım sadece HTML yer tutucu özelliğini kullanıyoruz. – ofnowhere