質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

323閲覧

ユーザー登録がうまくできない

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/05 06:38

編集2017/10/09 01:17

ユーザー登録がうまくできないです。
index.htmlに

<div class="newaccount"> <h2>New Account registration</h2> <form class="form-inline" action="{% url 'accounts:detail' %}" method="POST"> <div class="form-group"> <label for="id_username">Username</label> {{ regist_form.username }} {{ regist_form.username.errors }} </div> <div class="form-group"> <label for="id_email">Email</label> {{ regist_form.email }} {{ regist_form.email.errors }} </div> <div class="form-group"> <label for="id_password">Password</label> {{ regist_form.password1 }} {{ regist_form.password1.errors }} </div> <div class="form-group"> <label for="id_password">Password(conformation)</label> {{ regist_form.password2 }} {{ regist_form.password2.errors }} <p class="help-block">{{ regist_form.password2.help_text }}</p> </div> <button type="submit" class="btn btn-primary btn-lg">Regist</button> <input name="next" type="hidden"/> {% csrf_token %} </form>

と書いて、views.pyに

def login(request): login_form = LoginForm(request.POST) regist_form = RegisterForm(request.POST) if regist_form.is_valid(): user = regist_form.save(commit=False) context = { 'user': request.user, 'login_form': login_form, 'regist_form': regist_form, } print(33333) return redirect('profile', context) if login_form.is_valid(): user = login_form.save(commit=False) print(1111) print(user) login(request, user) context = { 'user': request.user, 'login_form': login_form, 'regist_form': regist_form, } print(33333) return redirect('profile', context) context = { 'login_form': login_form, 'regist_form': regist_form, } print(2222) return render(request, 'registration/accounts/login.html', context)

と、
models.pyに

class UserData(models.Model): user = models.ForeignKey("auth.User", verbose_name="imageforegin")

と書きました。
forms.pyには

class RegisterForm(UserCreationForm): class Meta: model = User fields = ('username', 'email',) def __init__(self, *args, **kwargs): super(RegisterForm, self).__init__(*args, **kwargs) self.fields['username'].widget.attrs['class'] = 'form-control' self.fields['email'].widget.attrs['class'] = 'form-control' self.fields['password1'].widget.attrs['class'] = 'form-control' self.fields['password2'].widget.attrs['class'] = 'form-control' class LoginForm(AuthenticationForm): def __init__(self, *args, **kwargs): super(LoginForm, self).__init__(*args, **kwargs) self.fields['username'].widget.attrs['class'] = 'form-control' self.fields['password'].widget.attrs['classF'] = 'form-control'

と書きました。
urls.pyには

from django.conf.urls import url from . import views from django.contrib.auth.views import login, logout from django.views.generic import TemplateView urlpatterns = [ url(r'^login/$', views.login,name='login'), url(r'^detail$', views.detail,name='detail'), ]

と書きました。views.pyはaccountsアプリ内に入っています。
ユーザーネーム・パスワード・Emailの全ての項目を埋めて、Registボタンを押すと次のページに飛びました。ここまでは良いのですが、adminサイトを見るとそのデータが入っていませんでした。ターミナルには2222が出力されていて、その部分を通っていることがわかります。なぜ

if regist_form.is_valid():

の中を通らないのか、
何が問題なのかわかりません。書き方や使っているメソッドが間違っているのでしょうか?
どう直せば良いのでしょうか?
実際のhtmlは

<form class="form-horizontal" action="/accounts/detail" method="POST">
 <div class="form-group-lg">
 <label for="id_username">ユーザネーム</label> 
<input autofocus="" class="form-control" id="id_username" maxlength="150" name="username" type="text" required />
 </div>

 <div class="form-group-lg">
 <label for="id_email">Eメール</label> 
 <input class="form-control" id="id_email" maxlength="254" name="email" type="email" /> </div>

 <div class="form-group-lg">
 <label for="id_password">パスワード</label>
 <input class="form-control" id="id_password1" name="password1" type="password" required />
 </div>

 <div class="form-group-lg"> <label for="id_password">パスワード(確認)</label>
 <input class="form-control" id="id_password2" name="password2" type="password" required /> <p class="help-block">確認のため、再度パスワードを入力してください。</p>
 </div>

 <div class="form-group-lg"> <div class="col-xs-offset-2"> <button type="submit" class="btn btn-primary btn-lg" style="color:white;background-color: #F62459;border-style: none;">登録</button>
 <input name="next" type="hidden"/>
 </div> </div> <input type='hidden' name='csrfmiddlewaretoken' value='XXXXXXXXXXXX' />
 </form>


気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2017/10/06 10:24

とりあえず、"2222"を出力するコードがないようなので、その部分を提示していただけますか。
退会済みユーザー

退会済みユーザー

2017/10/07 07:50

コードを追加しました!もし何かお分かりでしたら、よろしくお願いします
Lhankor_Mhy

2017/10/07 08:35

『Registボタンを押すと次のページに飛びました。』とありますが、この場合も"if regist_form.is_valid():"を通っていないのですか?
退会済みユーザー

退会済みユーザー

2017/10/07 11:24

はい、そうです
Lhankor_Mhy

2017/10/07 12:10

ちなみに、{% url 'accounts:detail' %} は正しいですか? urlpatternsをご提示いただくことはできますか?
退会済みユーザー

退会済みユーザー

2017/10/07 13:44

追加しました。でもそれは間違いなく正しいです。
Lhankor_Mhy

2017/10/07 15:43

これだとloginを通らないような気がしますが、大丈夫ですか?
退会済みユーザー

退会済みユーザー

2017/10/08 01:38

それはどうしてでしょうか?
Lhankor_Mhy

2017/10/08 03:51

実際に出力されたHTMLではどうなってますか? actionにはloginのURLが入ってますか?
退会済みユーザー

退会済みユーザー

2017/10/09 01:15

どこのことを行っているのかわからないのですが、該当しそうな箇所を質問に追加しておきました。もしお分かりでしたらよろしくお願いいたします
退会済みユーザー

退会済みユーザー

2017/10/09 05:39

ちなみに、今気づいたのですがログインもできていなかったです。
guest

回答1

0

ベストアンサー

<form class="form-inline" action="{% url 'accounts:detail' %}" method="POST">
と書いていますが
これではviews.pyにおそらく書いているのであろう

def detail(request): ...

の中が実行されてしまい、

if regist_form.is_valid(): user = regist_form.save(commit=False) context = { 'user': request.user, 'login_form': login_form, 'regist_form': regist_form, } print(33333) return redirect('profile', context) if login_form.is_valid(): user = login_form.save(commit=False) print(1111) print(user) login(request, user) context = { 'user': request.user, 'login_form': login_form, 'regist_form': regist_form, } print(33333) return redirect('profile', context)

この辺のif文は実行されません。
そもそもformのデータをもらった後

def login(request):   ...

が実行されていないので。
(Lhankor_Mhyさんがおっしゃっているloginを通らないと言っているのはこのことだと思います)

Djangoではこのようなフォームを含むページを書くときはactionは書かずに

<form class="form-inline" method="POST">

とすることでもう一度フォームのデータを含めた上で

def login(request): if request.method == 'POST': POSTでやってきてformデータを含む場合にやりたいことを書く else: GETでやってきてformデータを含んでない場合にやりたいことを書く

あるいはdetail側で処理したいなら

def detail(request): if request.method == 'POST': POSTでやってきてformデータを含む場合にやりたいことを書く else: GETでやってきてformデータを含んでない場合にやりたいことを書く

と、detail側でloginに書いたようなif文を書く必要があると思います。
この辺を参考にしてください。

https://docs.djangoproject.com/ja/1.11/intro/tutorial04/

投稿2017/10/09 23:14

編集2017/10/09 23:20
acre_maker

総合スコア145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問