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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

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

Q&A

解決済

1回答

1204閲覧

【django】CreateViewをidごとに分けて作成したい

seyu0930

総合スコア20

Django

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

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

0グッド

0クリップ

投稿2021/10/23 05:42

djangoで店舗毎に商品を宣伝できるようにするサイトを想定して作ろうとしています。
出品するときに企業名を自動で入力されるようにしたいです。
今のままですと、出品者が企業名を選択して出品するので他の企業の人も勝手に出品できてしまいます。
例えば、企業Aが出品する場合、/create/1/から商品を登録し、企業Bは/create/2/から出品するといったページを分ける方法。
(/create/1/から出品した場合、テーブルにshop_id = 1が入れられる。)
もしくは、認証機能を利用して、企業Aのアカウントでログインしている場合は企業Aをformの企業名に自動で追加する。
という2つの方法を考えました。
しかし、具体的に作ろうと思うと知識不足もあり、難しい状態です。
上記の二つの方法以外でも、良い方法がありましたらよろしくお願いします。

イメージ説明

python

1#models.py 2 3from django.db import models 4from django.db.models.deletion import PROTECT 5from django.db.models.fields import IntegerField 6from accounts.models import CustomUser 7 8# Create your models here. 9class Shop(models.Model): 10 #お店の概要 11 user = models.OneToOneField(CustomUser, verbose_name="ユーザー", on_delete=PROTECT) 12 shop_name = models.CharField(verbose_name="店の名前", max_length=30, unique=True) 13 shop_place = models.CharField(verbose_name="店の場所", max_length=60) 14 shop_style = models.CharField(verbose_name="お店の種類", max_length=10) 15 shop_describe = models.TextField(verbose_name="お店の詳細説明", max_length=300, default="記載がありません") 16 opening_time = models.TextField(verbose_name="お店の営業時間", max_length=300, default="記載がありません") 17 website = models.URLField(verbose_name="お店のホームページ", blank=True, null=True) 18 #photo1は縦横5:7の画像にするとぴったり 19 photo1 = models.ImageField(verbose_name="写真1", blank=True, null=True) 20 photo2 = models.ImageField(verbose_name="写真1", blank=True, null=True) 21 photo3 = models.ImageField(verbose_name="写真1", blank=True, null=True) 22 23 class Meta: 24 verbose_name_plural = "店舗情報" 25 26 def __str__(self): 27 return self.shop_name 28 29 30class Products(models.Model): 31 user = models.ForeignKey(CustomUser , verbose_name="ユーザー", on_delete=PROTECT) 32 shop = models.ForeignKey(Shop, verbose_name='企業名', on_delete=PROTECT) 33 product = models.CharField(verbose_name="商品名", max_length=20) 34 price = models.IntegerField(verbose_name="価格") 35 product_detail = models.TextField(verbose_name="商品説明", max_length=60, blank=True, null=True) 36 #画像サイズは縦横2:3がベスト 37 product_photo = models.ImageField(verbose_name="商品写真") 38 39 class Meta: 40 verbose_name_plural = "商品情報" 41 42 def __str__(self): 43 return self.product

python

1#urls.py 2 3from django.urls import path 4from .views import IndexView, ShopDetailView, CreateInfoView 5 6app_name = "shoplist" 7urlpatterns = [ 8 path("", IndexView.as_view(), name="index"), 9 path("detail/<int:pk>/", ShopDetailView.as_view(), name="detail"), 10 path("create/", CreateInfoView.as_view(), name="create"), 11]

python

1#views.py 2 3from django.contrib.auth.mixins import LoginRequiredMixin 4from django.shortcuts import render 5from django.views import generic 6from .models import Shop, Products 7from .forms import CreateInfoForm 8from django.urls import reverse_lazy 9from django.contrib import messages 10# Create your views here. 11 12 13class IndexView(generic.ListView): 14 model = Shop 15 template_name = "index.html" 16 17class ShopDetailView(generic.DetailView): 18 model = Shop 19 template_name = "detail.html" 20 21 def get_context_data(self, **kwargs): 22 context = super().get_context_data(**kwargs) 23 context['products_list'] = Products.objects.filter(shop=self.object) 24 return context 25 26class CreateInfoView(LoginRequiredMixin, generic.CreateView): 27 model = Products 28 template_name = "create.html" 29 form_class = CreateInfoForm 30 success_url = reverse_lazy("shoplist:index") 31 32 def form_valid(self, form): 33 diary = form.save(commit=False) 34 diary.user = self.request.user 35 diary.save() 36 messages.success(self.request, "作成しました。") 37 return super().form_valid(form) 38 39 def form_invalid(self, form): #バリデーションに問題があった場合実行 40 messages.error(self.request, "作成に失敗しました。") 41 return super().form_invalid(form)

python

1#forms.py 2 3from .models import Products 4from django import forms 5 6class CreateInfoForm(forms.ModelForm): 7 class Meta: 8 model = Products 9 fields = ("shop", "product", "product_detail", "price", "product_photo") 10 11 def __init__(self, *args, **kwargs): 12 super().__init__(*args, **kwargs) 13 for field in self.fields.values(): 14 field.widget.attrs["class"] = "form-control"

html

1{% extends "base.html" %} 2{% load static %} 3 4{% block header %} 5 <!-- Responsive navbar--> 6 <!-- Header--> 7 <header class="bg-dark py-1"> 8 <div class="container px-4 px-lg-5 my-5"> 9 <div class="text-center text-white"> 10 <h1 class="display-4 fw-bolder">商品登録</h1> 11 <p class="lead fw-normal text-white-50 mb-0">商品を登録するための仮ページです</p> 12 </div> 13 </div> 14 </header> 15{% endblock %} 16{% block main %} 17<div class="container"> 18 <div class="row"> 19 <div class="w-100"> 20 <form method="POST" enctype="multipart/form-data"> 21 {% csrf_token %} 22 <div class="table-responsive"> 23 <table class="table my-3"> 24 {{ form.as_table }} 25 </table> 26 <button class="btn btn-primary mb-3" type="submit">作成</button> 27 </form> 28 </div> 29 </div> 30</div> 31{% endblock %} 32 {% block footer %} 33 {% endblock %} 34 35

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

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

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

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

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

guest

回答1

0

ベストアンサー

ShopモデルとCustomUserモデルが1対1で紐づけていることを考えると、

  • フォームのPOST時点ではshopを考えない
  • フォームオブジェクトからのProducts保存時に認証済みユーザーをもとにShopを特定して紐付ける

といったアプローチは可能そうな気がします。

diff

1# forms.py 2class CreateInfoForm(forms.ModelForm): 3 class Meta: 4 model = Products 5+ # shopをフォームプロパティから除外 6+ fields = ("product", "product_detail", "price", "product_photo") 7- fields = ("shop", "product", "product_detail", "price", "product_photo") 8 9 def __init__(self, *args, **kwargs): 10 super().__init__(*args, **kwargs) 11 for field in self.fields.values(): 12 field.widget.attrs["class"] = "form-control"

diff

1# views.py 2class CreateInfoView(LoginRequiredMixin, generic.CreateView): 3 model = Products 4 template_name = "create.html" 5 form_class = CreateInfoForm 6 success_url = reverse_lazy("shoplist:index") 7 8 def form_valid(self, form): 9 diary = form.save(commit=False) 10 diary.user = self.request.user 11+ # shop をuserから直接参照 12+ diary.shop = self.request.user.shop 13 diary.save() 14 messages.success(self.request, "作成しました。") 15 return super().form_valid(form) 16 17 def form_invalid(self, form): #バリデーションに問題があった場合実行 18 messages.error(self.request, "作成に失敗しました。") 19 return super().form_invalid(form)

投稿2021/10/23 11:50

attakei

総合スコア2738

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

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

seyu0930

2021/10/25 06:42

ありがとうございます!うまく行きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問