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

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

ただいまの
回答率

90.51%

  • Python

    11756questions

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

  • Python 3.x

    9844questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Django

    1615questions

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

Djangoでのフォーム取得とDB比較について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,518

kazzzstudio

score 86

PythonとDjangoでWebアプリを作っていますが、Djangoでのフォームからの値取得と、その値をデータベースに格納されている値と比較する処理がうまくいかずハマっています。

たぶん、基本的なことではないかとは思うのですが、調べても解決できなかったので質問させてください。

フォームからdoctor_idとpasswordを取得して、取得したdoctor_idからデータベースに格納されているDoctorテーブルのdoctor_passwordを取得して、フォームからのpasswordと一致しているかどうかを比較する処理です。

アドバイスをいただけると幸いです。
よろしくお願いいたします。

model.py

class Doctor(models.Model):
        doctor_id = models.CharField(max_length=16, primary_key=True)
        clinic_id = models.ForeignKey(Clinic)
        doctor_email = models.CharField(max_length=64)
        doctor_password = models.CharField(max_length=32)
        doctor_name = models.CharField(max_length=32)
        create_date = models.DateTimeField(auto_now_add=True)
        modify_date = models.DateTimeField(auto_now=True)


form.py

from django import forms
from .models import Doctor

class LoginForm(forms.Form):
    # userid = forms.CharField()
    # password = forms.CharField()
    class Meta:
        model = Doctor
        fields = ('doctor_id', 'doctor_password',)

views.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse
from django.shortcuts import render
# from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
# from django.views.decorators.csrf import ensure_csrf_cookie
from .forms import LoginForm
from .models import Doctor

# @ensure_csrf_cookie
def user_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            # _id = id_username
            # _password = id_password
            # question = get_object_or_404(Doctor,)
            # question.choice_set.get(pk=request.POST['userid'])
            # _id = request.username
            # _password = request.password
            #
            # cd = form.cleaned_data
            # user = authenticate(username=cd['username'], password=cd['password'])


            _id = form.cleaned_data['doctor_id']
            _password = form.cleaned_data['doctor_password']
            # doctor_password = Doctor.doctor_password.get(doctor_id=_id)
            b = Doctor.objects.all().filter(doctor_id=_id)

            print (doctor_password)
            if _password is doctor_password:
                # if user.is_active:
                    login(request, user)
                    return HttpResponse('Authenticated successfully')
                # else:
                #     return HttpResponse('Disabled account')
            else:
                return HttpResponse('Invalid login')
    else:
        form = LoginForm()
    return render(request, 'apiv1/login.html', {'form': form})

login.html

{% extends "base.html" %}
{% load staticfiles%}

{% block title%}りもしん クリニック様システムログイン画面{% endblock %}

{% block remoshincss %}/static/css/style.css{% endblock %}

{% block content %}
    <div class="container">
    <div align="center" class="imgtop"><img id="profile-img" class="profile-img-card" src="/static/img/remoshinlogo.png" /></div>
        <div class="card card-container">
            <p id="profile-name" class="profile-name-card"></p>
            <form class="form-signin" action="{% url 'login' %}" method="post">{% csrf_token %}
                <!-- <span id="reauth-email" class="reauth-email"></span> -->
                 <input type="user" id="userid" name="userid" class="form-control inputUser" placeholder="ユーザーID" autofocus>
                <input type="password" id="password" name="password" class="form-control inputPassword" placeholder="パスワード">
                <input type="hidden" name="next" value="{{ next }}" />
                 <div class="this" align="center">パスワードをお忘れの方は<a href="password.html">こちら</a></div>
                <br>
                <div align="center"><button style="width: 200px;" class="btn btn-lg btn-primary btn-block btn-signin" type="submit"><font color="#708090">ログイン</font></button></div>
            </form>
        </div>
    </div>
{% endblock %}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tell_k

    2017/08/21 14:41

    具体的にソースのどこの処理で困ってるのか、書いてもらった方が回答がつきやすいと思います。

    キャンセル

  • kacchan822

    2017/08/22 07:10

    うまくいかないということなので、何らかのエラーが出ているものと推察します。試してみたことと、それでも発生するエラーまたは期待しない動作がどのようなものか、記載していただくとよいかと思います。

    キャンセル

回答 1

checkベストアンサー

0

どのファイルのどこで、どんなエラーが発生しているのか
生エラーコード貼り付けでも構わないので教えてもらえると、もっと具体的なアドバイスができます。

現状として、修正した方が良いと思う点は3点

  • 全体的に、コメント文は本当にコメント文?
    例えば、views.py内のこの記述
if _password is doctor_password:
    # if user.is_active:
        login(request, user)
                return HttpResponse('Authenticated successfully')
        # else:
        #     return HttpResponse('Disabled account')

このままだとPython文法的に動かないですよね?(Syntax Errorのはず)
各コメント文が本当にコメント文なのか、明記しておいてほしいです。

  • Formクラス?
    Formクラスを作ったのに、テンプレートlogin.htmlに生formを記述してしまうのですか?
    例えばこちらのQiitaリンク見て、login.htmlを作り直した方が良いかと。
    DjangoのForm(CreateView、UpdateViewなど)について

  • 生パスワード保存はちょっと……
    質問内容とはズレてしまいますが……DBに生パスワードを保存し、比較するのは(セキュリティ的に)やめておいた方がいいかと……
    AbstractUserを使うなどして、回避した方がいいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/26 13:06

    ご回答ありがとうございます。
    いろいろいじって、Djangoの認証処理を採用する方向でプログラムを書き直しました。
    たくさん問題点があったのですね。ご指摘ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Python

    11756questions

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

  • Python 3.x

    9844questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Django

    1615questions

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