coltonOP
@coltonOP (こるとんくん)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Djangoで同じformを複数回使いたい。

解決したいこと

DjangoでWebアプリを作成しているのですが、
同じformを複数回使う方法がわかりません。

現状の書き方ですと、全て同じもの判定になっているので、views.pyで値をいれると
全てに入ってしまいます。

どうしたらいいのでしょうか?

やりたいことの流れとしては、データベースに 0か1か2の数値が入っていて、
レコードすべてを読み取り、1つづつプルダウンに表示していくという形になります。

mendantime_b を何回も使い、1つ1つ違う値をviews.pyで入れていくには
どうしたらいいでしょうか?

よろしくお願いいたします。

models.py

class BelongMaster(models.Model):

    number_b = models.CharField(max_length=4, primary_key=True)
    name_b = models.CharField(max_length=32)
    mendanplace_b = models.IntegerField(
        choices = MENDAN_STATE,
        default = 0)
    mendantime_b = models.IntegerField(
        choices = MENDAN_TIME,
        default = 0)
    
    def __str__(self):
        
        return (self.number_b) + ':' + (self.name_b) + ':' + str(self.mendanplace_b) + ':' + str(self.mendantime_b)

forms.py

class SyozokuForm(forms.ModelForm):
    
    class Meta:
        model = BelongMaster
        fields = ['number_b','name_b','mendanplace_b','mendantime_b']

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

views.py


class SyozokuView(CreateView):
    
    template_name = "account/Syozoku.html"
    
    form_class = SyozokuForm
    
    def get_context_data(self, **kwargs):
        content = super().get_context_data(**kwargs)
        content['form'] = SyozokuForm(initial= {'mendanplace_b':BelongMaster.objects.get(number_b="5000").mendanplace_b,
                                                'mendantime_b' :BelongMaster.objects.get(number_b="5000").mendantime_b ,} )
        content.update({
                'BelongMaster':BelongMaster.objects.all().order_by("number_b"),
                })
        
        return content

html


<div class="table">
      
      <table class="hyou2">
           <tr>
                <th>所属</th>
                <th>面談場所</th>
                <th>面談時間</th>
           </tr>
           {% for syozoku in BelongMaster %}
           <tr class="{{ syozoku.number_b }}">
                <td >{{ syozoku.name_b }}{{ syozoku.mendanplace_b }}</td>
                <td>{% if syozoku.mendanplace_b == 0 %}
                        {{ form.mendanplace_b }}
                    {% elif syozoku.mendanplace_b == 1 %}
                        {{ form.mendanplace_b }}
                    {% else %}
                        {{ form.mendanplace_b }}
                    {% endif %}
                </td>
                <td>{% if syozoku.mendantime_b == 0 %}
                        {{ form.mendantime_b }}
                    {% elif syozoku.mendantime_b == 1 %}
                        {{ form.mendantime_b }}
                    {% else %}
                        {{ form.mendantime_b }}
                    {% endif %}
                </td>
           </tr>
           {% endfor %}
      </table>
      
      
  </div>
  
  <div class="button2">
      <a href="{% url 'account:sakusei' %}" class="btn-square-1">更新</a> <br>
      
  </div>

無題1.png

こんな風にしたいのだが......

無題12png.png

こうなってしまう......

追記

models.py

class BelongMaster(models.Model):

    number_b = models.CharField(max_length=4, primary_key=True)
    name_b = models.CharField(max_length=32)
    mendanplace_b = models.IntegerField(
        choices = MENDAN_STATE,
        default = 0)
    mendantime_b = models.IntegerField(
        choices = MENDAN_TIME,
        default = 0)
    
    def get_absolute_url(self):
        return reverse('account:Syozoku', kwargs={'pk': self.pk})
    
    def __str__(self):
        
        return (self.number_b) + ':' + (self.name_b) + ':' + str(self.mendanplace_b) + ':' + str(self.mendantime_b)

forms.py

class SyozokuForm(forms.ModelForm):
    
    class Meta:
        model = BelongMaster
        fields = ['number_b','name_b','mendanplace_b','mendantime_b']
        
        
SyozokuFormset = forms.modelformset_factory(model=BelongMaster,fields=('number_b','name_b','mendanplace_b','mendantime_b'),extra=0)

views.py


class SyozokuView(UpdateView):
    
    model = BelongMaster
    queryset = BelongMaster.objects.all()
    
    template_name = "account/Syozoku.html"
    
    form_class = SyozokuForm
    
    def get_context_data(self, **kwargs):
        ctx = super(SyozokuView, self).get_context_data(**kwargs)

        ctx.update(dict(formset=SyozokuFormset(self.request.POST or None, instance=self.object)))

        return ctx

    def form_valid(self, form):
        ctx = self.get_context_data()

        formset = ctx['formset']

        if formset.is_valid():
            self.object = form.save(commit=False)
            self.object.save()

            formset.save()

            return redirect(self.get_success_url())
        else:
            ctx['form'] = form
            return self.render_to_response(ctx)

urls.py


 path("<int:pk>/Syozoku/",views.SyozokuView.as_view(), name="Syozoku"),


エラー

Not Found: /Syozoku/
[13/Oct/2022 13:54:36] "GET /Syozoku/ HTTP/1.1" 404 3993

UpdateViewでmodelform_factoryを使用しようとしたところ
ページが見つからないとでました。

コードは間違っていないはずなのですがどういうことでしょうか.....

ここを参考にしました。

1

1Answer

initialで初期値を与えているのでその値になるのではないでしょうか?

# この部分
SyozokuForm(initial={hoge})

あとは、postメソッドになると思うので、{% csrf token %}があったほうが良いかと。

0Like

Comments

  1. @coltonOP

    Questioner

    その値になるのはわかるのですが、別々として扱うにはどうしたらいいのでしょうか?
  2. 現状、formを複数作られた方が良い気がします。

    それか、既にデータが入っているのであれば、`modelformset_factory`でも良いかと。
  3. @coltonOP

    Questioner

    modelformset_factoryを使ってコードを書き直してみたらこんどは404が....なにがいけないのでしょう.....
  4. Not Found: /Syozoku/

    urls.pyのpathと異なります。

Your answer might help someone💌