2017-11-08 19 views
1

私のプロジェクトでは、ユーザーがサインアップするとすぐに、この情報を入力する必要があるビューを更新するようにリダイレクトされます。ユーザーはサインアップ後も自動的にログインしていますので、編集することはできません。Djangoフォームの自動入力ユーザー

models.py

class Userpro(models.Model): 
    user = models.OneToOneField(User) 
    dob = models.DateField(default=datetime.date.today) 
    country = models.CharField(max_length=50, default='') 
    qualification = models.CharField(max_length=10, choices=CHO, 
default='No') 
    university = models.CharField(max_length=100, default='') 
    location = models.CharField(max_length=100, default='') 

    def __str__(self): 
     return str(self.user) 

forms.py

class UserProForm(forms.ModelForm): 
    class Meta: 
     model = Userpro 
     fields = '__all__' 

views.py

def update(request): 
    if request.method == 'POST': 
     form = UserProForm(request.POST or None) 
     if form.is_valid(): 
      form.save() 
      return redirect('/') 
     else: 
      redirect('/') 
    else: 
     form = UserProForm() 
     return render(request, 'app/update.html', {'form': form}) 

すべての必要なライブラリがインポートされます。

+1

編集可能にしたくない場合は、単にフォーム(フィールド)を表示しないでください。 – hansTheFranz

+0

@hansTheFranzはい、あなたは正しいですが、私はそれが現在のユーザーを見て自動入力されるようにしたいと思います。 –

答えて

1

フォームにwidgetsを使用できます。このようなもの(以下のコードはテストされていません)。

from django.forms import TextInput 


class UserProForm(forms.ModelForm): 
    class Meta: 
     model = Userpro 
     fields = '__all__' 
     widgets = { 
      'user': TextInput(attrs={'readonly': 'readonly'}) 
     } 

def update(request): 
    instance = Userpro.objects.filter(user=request.user).first() 
    if request.method == 'POST': 
     form = UserProForm(request.POST, instance=instance) 
     if form.is_valid(): 
      form.save() 
      return redirect('/') 
     else: 
      return redirect('/') 
    else: 
     form = UserProForm(instance=instance) 
     return render(request, 'app/update.html', {'form': form}) 

編集:私たちはこのように辞書内のユーザーを渡す必要があります。 form = UserProForm({'user': request.user})

編集2:あなたは、最初のプロファイルオブジェクトを検索し、フォーム

instance = Userpro.objects.filter(user=request.user).first() 
form = UserProForm(request.POST, instance=instance) 
+0

エラーが発生しました。ビューapp.views.updateはHttpResponseオブジェクトを返しませんでした。代わりにNoneを返しました –

+1

user = request.userは引数ではありません。 –

+0

私は同じユーザーのためにこのフォームをもう一度記入すると、その情報がupdate.Butを取得する必要があることを願っています。前もって感謝します –

1

私はそれを考えるにそれを渡す必要があります変更したいフィールドを持つModelFormを使用し、そのようなテンプレートのオブジェクトインスタンス値を表示する方が良いでしょう。

from django.forms import TextInput 


class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = Userprofile 
     fields = ('field1', 'field2') 

def update(request): 
    if request.method == 'POST': 
     form = UserProfileForm(request.POST or None) 
     if form.is_valid(): 
      form.save() 
      return redirect('/') 
     else: 
      redirect('/') 
    else: 
     form = UserProfileForm(user=request.user) 
     return render(request, 'app/update.html', {'form': form}) 


# template 
    <form method="post"> 
     {% csrf_token %} 

     <div class="form-row"> 
      {{ form.field1.errors }} 
      {{ form.field1.label_tag }} {{ form.field1 }} 
     </div> 
     <div class="form-row"> 
      {{ form.field2.errors }} 
      {{ form.field2.label_tag }} {{ form.field2 }} 
     </div> 
     <div class="form-row"> 
      {{ form.instance.field3.errors }} 
      {{ form.instance.field3.label_tag }} {{ form.instance.field3 }} 
     </div> 
    </form> 
関連する問題