web-dev-qa-db-ja.com

Django:2つの引数を持つ表示(またはURL?)を指示するHTMLフォームアクション

Django=約1週間前に学習を開始し、壁にぶつかりました。啓発を本当に感謝します...

models.py

_class data(models.Model):
    course = models.CharField(max_length = 250)

    def __str__(self):
        return self.course
_

html

Models.courseのオブジェクトをschlistに変換しました

_<link rel="stylesheet" type="text/css" href="{% static '/chosen/chosen.css' %}" />
<form action={% views.process %}  method="GET">
      <div>
        <h4 style="font-family:verdana;">First Course: </h4>
        <select data-placeholder="Course" style="width:350px;" class="chosen-select" tabindex="7">
          <option value=""></option>
          {% for item in schlist %}
          <option> {{ item }} </option>
          {% endfor %}
        </select>
      </div>
      </br>
      <div>
        <h4 style="font-family:verdana;">Second Course:</h4>
        <select data-placeholder="Course" style="width:350px;" class="chosen-select" tabindex="7">
          <option value=""></option>
          {% for item in schlist %}
          <option> {{ item }} </option>
          {% endfor %}
        </select>
      </div>
      </br>
  <input type="submit" value="Compare!" />
</form>
_

urls.py(これが機能するかどうか疑問に思っています...)

_urlpatterns = [
    url(r'^(\d+)/(\d+)$',views.process, name = 'process'),
]
_

view.py

_def process(request,q1 ,q2):
    obj1= get_object_or_404(Schdata, course = q1)
    obj2= get_object_or_404(Schdata, course = q2)
 ........
_

フォームアクションがアクションを指示することが可能かどうか疑問に思っていました

(1)view.pyまたは(2)2つの引数が選択されたurl.py(および最終的にはview.py)?

もしそうなら、フォームアクションはどうあるべきですか? {{view?}}または{{url?}}。 HTMLで引数の定義を見逃していますか?

Views.pyへのリダイレクト:

ユーザー入力はCharFieldで、_get_object_or_404_を使用してモデルpkを取得できます。ただし、urls.pyを定義すると、url引数が主キーであるため、Noreverseエラーが発生します。

Urls.pyへのリダイレクト:

URL引数は主キーです。私の見たところ、urls.pyに渡す前に、ユーザー入力Charfieldをpkに魔法のように変換する必要があります。

Djangoのget()の(または)関数はありますか?例:get_object_or_404(pk = q1 or course = q1)

本当にアドバイスをいただければ幸いです。何時間もこれを見つめていた。

5
Lolerla

DjangoでURLの逆解決を使用しようとしています。

あなたのhtmlファイルで次の正しいフォームアクションURLとメソッドはPOSTでなければなりません:

<form action={% url 'process' %}  method="POST">

パラメータを一緒に渡そうとしている場合は、これを使用してください:

<form action={% url 'process' request.user.id 4 %}  method="POST">

リファレンス: https://docs.djangoproject.com/en/1.10/topics/http/urls/

17
Abijith Mg

はい私は遅れていますが、Djangoがリクエストを処理する方法を理解するために他の人を助けることができます。

Django 3.0パターン

Djangoがリクエストを処理する方法

基本:

  1. まずDjango一致するURLを確認します。
  2. URLが一致した場合、定義されたビューを呼び出してリクエストを処理します。 (成功)
  3. URLが一致しない、または見つからない場合、Djangoがエラーのページが見つかりません

詳しく読む:

公式Djangoドキュメントの方法Djangoリクエストを処理する


これらはあなたのURLパターンです:

urlpatterns = [ path('profile/edit/<int:pk>/',views.editprofile, name='editprofile'),]

Urlpatternsの3番目の引数は、urlパターンをcurrentからthisに変更する場合に使用します。

urlpatterns = [ url('profile/edit/user/id/<int:pk>',views.editprofile, name = 'editprofile'),]

URL名を使用するすべてのテンプレートでURLパターンを再定義する必要はありません。

例:

これは私のテンプレートですprofile.htmlハードコードされたURLではなくURL名を使用しました。

<a class="item" href="{% url 'editprofile' user.id %}" >Edit profile </a>

問題の解決策:

。html

テンプレートでハードコードされたURLの代わりにURL名のみを使用し、引数を渡します。

<form action={% process no_of_arguments  %}  method="POST">

views.py

ここでリクエストを処理できます

def process(request,no_of_arguments):

良くなるDjango開発者

モデルにDjango ModelFormsを使用することもできます。モデルフォームまたは単純なフォームを使用すると、複数のことができます

  • モジュール式アプローチ
  • Views.pyではなく、関連する形式でサーバー側の検証を記述します
  • 読み取り可能なコード-クリーンなコード