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

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

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

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

Python

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

Q&A

解決済

1回答

1094閲覧

Django フィールドへの値の追加ができない

dogwanwan

総合スコア4

Django

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

Python

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

0グッド

0クリップ

投稿2021/07/03 09:50

前提・実現したいこと

python(Django)で出席管理アプリを作っていて、現在教師のpassword登録画面を作成している段階です。
passwordが登録されるデータベースは以下の画像のようになっていてpassword以外のデータは既に登録されています。
ブラウザでTeacher idとpasswordを打ち込むとTeacher idと一致するレコードのpasswordのフィールドに値が保存されるという仕組みにしようとしています。
イメージ説明

発生している問題・エラーメッセージ

ブラウザ上でTeacher idとpasswordを打ち込んで実行してみるとブラウザ上では問題なく「登録が完了しました」と表示されるのですが、Django管理サイトの該当するレコードのpasswordには値が入っていません。
どうすれば値を追加できるのか教えて頂きたいです。

該当のソースコード

views.py

python

1from django.shortcuts import render 2from django.db import IntegrityError 3from django.contrib.auth import authenticate, login 4from .models import Teacher 5 6def signupfunc(request): 7 if request.method == "POST": 8 9 id = request.POST['teacher_id'] 10 pw = request.POST['password'] 11 12 if Teacher.objects.filter(teacher_id = id).exists(): #入力された教師idがDBに存在するか条件づけ,していたらidを取得し変数に代入 13 teacher = Teacher.objects.filter(teacher_id = id) 14 teacher.password = pw 15 teacher.bulk_update(teacher, ["password"]) 16 return render(request, 'signup.html',{'context':'登録が完了しました.'}) 17 else: 18 return render(request, 'signup.html', {'error':'このユーザーはすでに登録されています.'}) 19 20 return render(request, 'signup.html', )

models.py

python

1from django.db import models 2 3class Teacher(models.Model): 4 subject_id = models.CharField(max_length=10) 5 subject_name = models.CharField(max_length=128) 6 teacher_id = models.CharField(max_length=10) 7 teacher_name = models.CharField(max_length=20) 8 start_time = models.TimeField(null=True) 9 finish_time = models.TimeField(null=True) 10 attend_time = models.IntegerField(null=True) 11 late_time = models.IntegerField(null=True) 12 password = models.CharField(max_length=128)

signup.html

HTML

1<!DOCTYPE html> 2{% extends 'base.html' %} 3 4{% block content %} 5<body> 6 <form method="POST">{% csrf_token %} 7 {{ error }} 8 {{ context }} 9 <h1 class="h3 mb-3 fw-normal">Please sign in</h1> 10 <div class="form-floating"> 11 <label for="floatingInput">教員ID</label> 12 <input type="teacher_id" class="form-control" id="floatingname" name="teacher_id" placeholder="例)P000"> 13 </div> 14 <div class="form-floating"> 15 <label for="floatingPassword">パスワード</label> 16 <input type="password" class="form-control" id="floatingPassword" name="password" placeholder="Password"> 17 </div> 18 <button class="w-100 btn btn-lg btn-primary" type="submit">Sign in</button> 19 20 </form> 21</body> 22{% endblock content %}

補足情報(FW/ツールのバージョンなど)

database(sqlite)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1teacher = Teacher.objects.filter(teacher_id = id)

の部分を

python

1teacher = Teacher.objects.get(teacher_id = id)

にしたらどうなりますか?

filterだと該当するモデルのリスト(QuerySet)しか返ってこないので、
「teacher.password = pw」で下記のエラーがコンソール画面に出ていると思います。
「AttributeError: 'QuerySet' object has no attribute 'password'」

「Teacher.objects.get(teacher_id = id)」のようにgetを使うことで、
該当のTeacherモデル自体を参照できます。

これなら「teacher.password = pw」でエラーが出ないと思います。

投稿2021/07/09 15:25

TechChuna

総合スコア86

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

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

dogwanwan

2021/07/11 06:14

解決できました!ありがとうございます!! filterとgetの違いをきちんと把握できていませんでした! ご回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問