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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/25 06:42