現在チャットアプリの為にRoomモデルを作成したいのですが上手くviewにpkを渡せていないみたいです。
TeacherモデルとCustomerモデルがありまして、
それぞれのモデルとRoomモデルを紐づけてあります。
[accounts/models.py]
from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): is_customer = models.BooleanField(default=False) is_teacher = models.BooleanField(default=False) class Customer(models.Model): user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True) age = models.CharField(verbose_name='年齢', blank=True, null=True, max_length=10) personality = models.TextField(verbose_name='アピールポイント', blank=True, null=True, max_length=1000) profile_picture = models.ImageField(verbose_name = 'プロフィール画像', blank=True, null=True, upload_to='images/', default='default_user_icon.png') def __str__(self): return self.user.username class Teacher(models.Model): user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True) age = models.CharField(verbose_name='年齢', blank=True, null=True, max_length=10) personality = models.TextField(verbose_name='アピールポイント', blank=True, null=True, max_length=1000) profile_picture = models.ImageField(verbose_name = 'プロフィール画像', blank=True, null=True, upload_to='images/', default='default_user_icon.png') def __str__(self): return self.user.username
[models.py]
from django.db import models from django.conf import settings from accounts.models import User, Customer, Teacher class Room(models.Model): teacher_id = models.ForeignKey(Teacher, null=True, blank=True, on_delete=models.CASCADE) customer_id = models.ForeignKey(Customer, null=True, blank=True, on_delete=models.CASCADE)
ログイン中のカスタマーが選択したteacherに連絡する為の連絡するボタンをクリックすると、
POSTが実行されます。
{{ form.object.teacher.pk.as_hidden }}
を使用し、
for文によって回されたteacherのpkを記述しています。
[index.html]
{% if user.is_authenticated %} <div class="row row-cols-1 row-cols-md-3 g-4"> {% for object in object_list %} <div class="user_col"> <div class="col"> <form action="{% url 'create_room' %}" method="POST"> {% csrf_token %} {{ form.object.teacher.pk.as_hidden }} <div class="card h-100"> <img src="{{ object.teacher.profile_picture.url }}" class="card-img-top" height="280"> <div class="card-body"> <h5 class="card-title name_age">{{ object.username }}</h5><h5 class="card-title name_age">( {{ object.teacher.age }} 歳)</h5> <p class="card-text">{{ object.teacher.personality }}</p> {% if user.customer %} <button class="btn btn-primary" class="submit">連絡する</button> {% endif %} </div> </div> </form> </div> </div> {% endfor %} </div> {% else %}
そしてここで、テンプレートから渡されたteacherのpkとログイン中のcustomerのpkを使用しfilterにかけたいのですが、print(form.cleaned_data.get('pk')
を試すと出力結果がNoneになります。
{{ form.object.teacher.pk.as_hidden }}
おそらくこちらの記述方法が間違ってると思ってます。
ご教授頂ければ幸いです。よろしくお願い致します。
[views.py]
from django.shortcuts import redirect from django.views.generic import ListView, DetailView from .forms import CreateRoomForm from accounts.models import User from .models import Room, Message class TeacherListView(ListView): model = User template_name = 'index.html' def get_queryset(self): queryset = User.objects.filter(is_teacher=True) return queryset class RoomMessagesListView(DetailView): model = Message template_name = 'room.html' def CreateRoom(request): if request.method == 'POST': form = CreateRoomForm(request.POST) if form.is_valid(): room_data = Room.objects.filter(teacher_id=form.cleaned_data.get('pk'), customer_id=request.user.pk) if room_data is not None: return redirect('room', pk=room_data[0].pk) else: room_data = Room() room_data.teacher_id = form.cleaned_data.get('pk') room_data.customer_id = request.user.pk room_data.save() return redirect('room', pk=room_data.pk)
[forms.py]
from django import forms from .models import Room class CreateRoomForm(forms.ModelForm): class Meta: model = Room fields = ('teacher_id',)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。