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

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

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

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

Python

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

Q&A

解決済

1回答

775閲覧

django modelからの削除について

yuujiMotoki

総合スコア90

Django

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

Python

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

0グッド

0クリップ

投稿2020/08/26 02:24

編集2020/08/28 07:54

#内容
DJANGOのモデルからデータを削除するVIEWを書いています。
対象としているMODELが複数ある場合に、URLパターンで対象のモデルを引数で渡して、VIEWSの処理側に分岐を入れて処理しようと思っています。

#質問
下記のように、HTML側にurl関数を書いて、PYTHON側で<dic>で受けたいのですが、どう書けばいいでしょうか?

クライアント側
<a href="{% url 'delete' #ここで<dic>を渡したい# w.id %}">Delete</a></center></td>

サーバ側
path('delete/<dic>/<id>', views.delete, name='delete'),

#補足
モデルを追加しました。
アプリケーションは、英語、中国語、日本語の辞書です。
各MODELに合わせてTEMPLATEを4つ(同じものを使いまわし)作っています。

要するに、URLのルーティングで 引数を2つ渡したいというのが、質問の趣旨になります。

html

1TEMPLATE(*.html) 2 3{% if all_words %} 4 <table class="table table-bordered"> 5 {% for w in all_words %} 6 <tr> 7 <td><a>{{ w.word }}</a></td> 8 <td><a>{{ w.definition }}</a></td> 9 <td><center><a href="{% url 'delete'ここで<dic>を渡したい'  w.id %}">Delete</a></center></td> 10 </tr> 11 {% endfor %} 12 </table> 13 {% endif %} 14

python

1urls.py 2urlpatterns = [ 3 path('delete/<dic>/<id>', views.delete, name='delete'), 4] 5 6 7 8views.py 9def delete(request, dic, id): 10 pdb.set_trace() 11 if dic == "All": 12 w = DictionaryAll.objects.get(id=id) 13 w.delete() 14 elif dic == "J": 15 w = DictionaryJ.objects.get(id=id) 16 w.delete() 17 elif dic == "C": 18 w = DictionaryC.objects.get(id=id) 19 w.delete() 20 elif dic == "E": 21 w = DictionaryE.objects.get(id=id) 22 w.delete() 23 else: 24 None 25 #messages.success(request, 'Word Has Been Deleted!') 26 #return redirect('content' + dic) 27 return 28 29model.py 30from django.db import models 31import json 32 33class DictionaryE(models.Model): 34 word = models.CharField(max_length=50, null=True, blank=True) 35 definition = models.CharField(max_length=1000, null=True, blank=True) 36 37 def __str__(self): 38 return self.word 39 40class DictionaryC(models.Model): 41 word = models.CharField(max_length=50, null=True, blank=True) 42 definition = models.CharField(max_length=1000, null=True, blank=True) 43 44 def __str__(self): 45 return self.word 46 47class DictionaryJ(models.Model): 48 word = models.CharField(max_length=50, null=True, blank=True) 49 definition = models.CharField(max_length=1000, null=True, blank=True) 50 51 def __str__(self): 52 return self.word 53 54class DictionaryAll(models.Model): 55 english = models.ForeignKey(DictionaryE , on_delete=models.CASCADE)#, to_field='word') 56 japanese = models.ForeignKey(DictionaryJ , on_delete=models.CASCADE)#), to_field='word') 57 chinese = models.ForeignKey(DictionaryC , on_delete=models.CASCADE)#, to_field='word')

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/08/28 06:54

Modelも分からず、何がしたいのかも分からず、dicが何なのかも分からないので、答えにくいのですが、とりあえずurls.pyでの<dictionary_id>は<id>にしないとdelete()関数の引数と名前が合わないのでエラーになりますよ。 <dic>は必要なものなのでしょうか?必要であれば目的を教えて下さい。 あと、Modelも必要です。
退会済みユーザー

退会済みユーザー

2020/08/28 07:15 編集

# 動くものがないとお互いに確認できないので、Unix系でしか動きませんが、空のディレクトリで実行すると3つファイルを作り # . create_env.sh # とするとソースを作ってdjangoが起動するスクリプトを書いてみました。 sed 's/^\xc2\xa0/ /;s/¥/\\/g;s/$/$/g;s/`/`/g;s/ /\x20\x20/g' <<__END_OF_TERMINAL_CODE__ >answered_all.patch diff --git a/myapp/admin.py b/myapp/admin.py index 8c38f3f..85d969d 100644 --- a/myapp/admin.py +++ b/myapp/admin.py @@ -1,3 +1,7 @@ +""" +admin.py +"""  from django.contrib import admin +from .models import WordDefinition   -# Register your models here. +admin.site.register(WordDefinition) diff --git a/myapp/models.py b/myapp/models.py index 71a8362..cd2b051 100644 --- a/myapp/models.py +++ b/myapp/models.py @@ -1,3 +1,11 @@ +""" +models.py +"""  from django.db import models   -# Create your models here. +class WordDefinition(models.Model): +  """ +  Word and its Definition +  """ +  word = models.CharField('単語', max_length=200, unique=True, null=False) +  definition = models.CharField('定義', max_length=1024, null=False) diff --git a/myapp/templates/myapp/index.html b/myapp/templates/myapp/index.html new file mode 100644 index 0000000..d44f468 --- /dev/null +++ b/myapp/templates/myapp/index.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html lang="ja"> + +<head> +  <meta charset="utf-8"> +</head> + +<body> +  {% if all_words %} +  <table class="table table-bordered"> +    {% for w in all_words %} +    <tr> +      <td><a>{{ w.word }}</a></td> +      <td><a>{{ w.definition }}</a></td> +      <td style="text-align: center;"> +        <a href="{% url 'delete' w.id %}">Delete</a> +      </td> +    </tr> +    {% endfor %} +  </table> +  {% endif %} +</body> + +</html> ¥ No newline at end of file diff --git a/myapp/urls.py b/myapp/urls.py new file mode 100644 index 0000000..8f3ed55 --- /dev/null +++ b/myapp/urls.py @@ -0,0 +1,10 @@ +""" +urls.py +""" +from django.urls import path +from . import views + +urlpatterns = [ +  path('', views.index, name='index'), +  path('delete/<word_id>', views.delete, name = 'delete') +] diff --git a/myapp/views.py b/myapp/views.py index 91ea44a..ad4060d 100644 --- a/myapp/views.py +++ b/myapp/views.py @@ -1,3 +1,24 @@ +""" +View +"""  from django.shortcuts import render +from django.http import HttpResponse +from django.urls import reverse +from .models import WordDefinition   -# Create your views here. +def index(request): +  """ +  list words and links for deletion. +  """ +  words = WordDefinition.objects.all() +  return render(request, 'myapp/index.html', {"all_words": words}) + +def delete(request, word_id): +  """ +  delete the specified word. +  """ +  word = WordDefinition.objects.get(id=word_id) +  word.delete() + +  return HttpResponse('<div>Word Has Been Deleted!</div>'¥ +    '<div><a href="{url}">back to index</a></div>'.format(url=reverse('index'))) diff --git a/mysite/settings.py b/mysite/settings.py index 81f7dc8..036afe9 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -31,6 +31,7 @@ ALLOWED_HOSTS = []  # Application definition    INSTALLED_APPS = [ +  'myapp.apps.MyappConfig',    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes', @@ -103,9 +104,9 @@ AUTH_PASSWORD_VALIDATORS = [  # Internationalization  # https://docs.djangoproject.com/en/3.1/topics/i18n/   -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'ja-jp'   -TIME_ZONE = 'UTC' +TIME_ZONE = 'Asia/Tokyo'    USE_I18N = True   diff --git a/mysite/urls.py b/mysite/urls.py index e7f9f35..b41a8b1 100644 --- a/mysite/urls.py +++ b/mysite/urls.py @@ -14,8 +14,9 @@ Including another URLconf    2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))  """  from django.contrib import admin -from django.urls import path +from django.urls import path, include    urlpatterns = [ +  path('myapp/', include('myapp.urls')),    path('admin/', admin.site.urls),  ] __END_OF_TERMINAL_CODE__ sed 's/^\xc2\xa0/ /;s/¥/\\/g;s/$/$/g;s/`/`/g;s/ /\x20\x20/g' <<__END_OF_TERMINAL_CODE__ >create_env.sh PYTHONCOMMAND="python3" if ! command -v python3; then   PYTHONCOMMAND="python" fi $PYTHONCOMMAND -m venv env . env/bin/activate pip install --upgrade pip pip install django==3.1 django-admin startproject mysite cd mysite django-admin startapp myapp patch -p1 <../answered_all.patch python manage.py makemigrations python manage.py migrate python manage.py loaddata ../myapp.WordDefinition.json python manage.py runserver __END_OF_TERMINAL_CODE__ sed 's/^\xc2\xa0/ /;s/¥/\\/g;s/$/$/g;s/`/`/g;s/ /\x20\x20/g' <<__END_OF_TERMINAL_CODE__ >myapp.WordDefinition.json [{"model": "myapp.worddefinition", "pk": 1, "fields": {"word": "単語1", "definition": "単語1の定義"}}, {"model": "myapp.worddefinition", "pk": 2, "fields": {"word": "単語2", "definition": "単語2の定義"}}, {"model": "myapp.worddefinition", "pk": 3, "fields": {"word": "単語3", "definition": "単語3の定義"}}] __END_OF_TERMINAL_CODE__
guest

回答1

0

ベストアンサー

テンプレートでのurlタグについて複数の引数を取る構文は、

https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#url

のとおりです。今回のケースでは、

urls.py

python

1urlpatterns = [ 2 path('delete/<dic>/<id>', views.delete, name='delete'), 3]

views.py

python

1def delete(request, dic, id):

xxxx.html

python

1<a href="{% url 'delete' dic w.id %}">Delete</a>

のような形になります。xxxx.htmlテンプレートを使用するviewで、オブジェクトのプロパティにdicを設定してあげることで、リンクに反映され、ルーティングで読み取られ、viewに渡ります。

一応前にコメントしたサンプルに引数langをダミーで加えたバージョンを付記しておきます。

bash

1PYTHONCOMMAND="python3" 2if ! command -v python3; then 3 PYTHONCOMMAND="python" 4fi 5$PYTHONCOMMAND -m venv env 6. env/bin/activate 7pip install --upgrade pip 8pip install django==3.1 9django-admin startproject mysite 10cd mysite 11django-admin startapp myapp 12patch -p1 << __END_OF_TERMINAL_CODE__ 13diff --git a/myapp.WordDefinition.json b/myapp.WordDefinition.json 14new file mode 100644 15index 0000000..34d0aaa 16--- /dev/null 17+++ b/myapp.WordDefinition.json 18@@ -0,0 +1,2 @@ 19+[{"model": "myapp.worddefinition", "pk": 1, "fields": {"word": "単語1", "definition": "単語1の定義"}}, {"model": "myapp.worddefinition", "pk": 2, "fields": {"word": "単語2", "definition": "単語2の定義"}}, {"model": "myapp.worddefinition", "pk": 3, "fields": {"word": "単語3", "definition": "単語3の定義"}}] 20+ 21diff --git a/myapp/admin.py b/myapp/admin.py 22index 8c38f3f..85d969d 100644 23--- a/myapp/admin.py 24+++ b/myapp/admin.py 25@@ -1,3 +1,7 @@ 26+""" 27+admin.py 28+""" 29 from django.contrib import admin 30+from .models import WordDefinition 31 32-# Register your models here. 33+admin.site.register(WordDefinition) 34diff --git a/myapp/models.py b/myapp/models.py 35index 71a8362..cd2b051 100644 36--- a/myapp/models.py 37+++ b/myapp/models.py 38@@ -1,3 +1,11 @@ 39+""" 40+models.py 41+""" 42 from django.db import models 43 44-# Create your models here. 45+class WordDefinition(models.Model): 46+ """ 47+ Word and its Definition 48+ """ 49+ word = models.CharField('単語', max_length=200, unique=True, null=False) 50+ definition = models.CharField('定義', max_length=1024, null=False) 51diff --git a/myapp/templates/myapp/index.html b/myapp/templates/myapp/index.html 52new file mode 100644 53index 0000000..a76e60d 54--- /dev/null 55+++ b/myapp/templates/myapp/index.html 56@@ -0,0 +1,24 @@ 57+<!DOCTYPE html> 58+<html lang="ja"> 59+ 60+<head> 61+ <meta charset="utf-8"> 62+</head> 63+ 64+<body> 65+ {% if all_words %} 66+ <table class="table table-bordered"> 67+ {% for w in all_words %} 68+ <tr> 69+ <td><a>{{ w.word }}</a></td> 70+ <td><a>{{ w.definition }}</a></td> 71+ <td style="text-align: center;"> 72+ <a href="{% url 'delete' lang w.id %}">Delete</a> 73+ </td> 74+ </tr> 75+ {% endfor %} 76+ </table> 77+ {% endif %} 78+</body> 79+ 80+</html> 81\ No newline at end of file 82diff --git a/myapp/urls.py b/myapp/urls.py 83new file mode 100644 84index 0000000..5e7a908 85--- /dev/null 86+++ b/myapp/urls.py 87@@ -0,0 +1,10 @@ 88+""" 89+urls.py 90+""" 91+from django.urls import path 92+from . import views 93+ 94+urlpatterns = [ 95+ path('', views.index, name='index'), 96+ path('delete/<lang>/<word_id>', views.delete, name = 'delete') 97+] 98diff --git a/myapp/views.py b/myapp/views.py 99index 91ea44a..6e68633 100644 100--- a/myapp/views.py 101+++ b/myapp/views.py 102@@ -1,3 +1,25 @@ 103+""" 104+View 105+""" 106 from django.shortcuts import render 107+from django.http import HttpResponse 108+from django.urls import reverse 109+from .models import WordDefinition 110 111-# Create your views here. 112+def index(request): 113+ """ 114+ list words and links for deletion. 115+ """ 116+ words = WordDefinition.objects.all() 117+ return render(request, 'myapp/index.html', {"all_words": words, "lang": "hoge"}) 118+ 119+def delete(request, lang, word_id): 120+ """ 121+ delete the specified word. 122+ """ 123+ word = WordDefinition.objects.get(id=word_id) 124+ word.delete() 125+ 126+ return HttpResponse('<div>Word Has Been Deleted!</div>'\ 127+ '<div><a href="{url}">back to index</a>{lang}</div>' 128+ .format(url=reverse('index'), lang=lang)) 129diff --git a/mysite/settings.py b/mysite/settings.py 130index 5680ac4..20a2808 100644 131--- a/mysite/settings.py 132+++ b/mysite/settings.py 133@@ -31,6 +31,7 @@ ALLOWED_HOSTS = [] 134 # Application definition 135 136 INSTALLED_APPS = [ 137+ 'myapp.apps.MyappConfig', 138 'django.contrib.admin', 139 'django.contrib.auth', 140 'django.contrib.contenttypes', 141@@ -103,9 +104,9 @@ AUTH_PASSWORD_VALIDATORS = [ 142 # Internationalization 143 # https://docs.djangoproject.com/en/3.1/topics/i18n/ 144 145-LANGUAGE_CODE = 'en-us' 146+LANGUAGE_CODE = 'ja-jp' 147 148-TIME_ZONE = 'UTC' 149+TIME_ZONE = 'Asia/Tokyo' 150 151 USE_I18N = True 152 153diff --git a/mysite/urls.py b/mysite/urls.py 154index e7f9f35..b41a8b1 100644 155--- a/mysite/urls.py 156+++ b/mysite/urls.py 157@@ -14,8 +14,9 @@ Including another URLconf 158 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 159 """ 160 from django.contrib import admin 161-from django.urls import path 162+from django.urls import path, include 163 164 urlpatterns = [ 165+ path('myapp/', include('myapp.urls')), 166 path('admin/', admin.site.urls), 167 ] 168__END_OF_TERMINAL_CODE__ 169python manage.py makemigrations 170python manage.py migrate 171python manage.py loaddata myapp.WordDefinition.json 172python manage.py runserver 173

投稿2020/08/28 09:33

編集2020/08/28 15:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuujiMotoki

2020/09/10 07:24

ありがとうございました。 テンプレートの中の url_for には、 スペース句切りで引数をいれれば、いくらでも渡せることを理解いたしました。 大変詳しく教えて頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問