簡體   English   中英

Django - 返回沒有字段的每個 model 值

[英]Django - return each model value without field

Priority model 具有三個值,對於每個值,我將返回一個inlineform ,允許用戶為每個優先級設置分數,然后與項目一起保存。

這是它目前的樣子:當前視圖

我的問題是:如何自動顯示所有優先級值並允許用戶輸入分數但不必選擇Priority 是否可以像下圖一樣顯示它?

我正在嘗試做的事情。

視圖.py

class ProjectCreateview(LoginRequiredMixin, CreateView):
    model = Project
    form_class = ProjectCreationForm
    login_url = "/login/"
    success_url = '/'

    def get_context_data(self, **kwargs):

        PriorityChildFormset = inlineformset_factory(
            Project, ProjectPriority, fields=('project', 'priority', 'score'), can_delete=False, extra=Priority.objects.count(),
        )

        data = super().get_context_data(**kwargs)
        if self.request.POST:
            data['priorities'] = PriorityChildFormset(self.request.POST)
        else:
            data['priorities'] = PriorityChildFormset()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        prioritycriteria = context["priorities"]
        form.instance.creator = self.request.user
        self.object = form.save()
        prioritycriteria.instance = self.object
        if prioritycriteria.is_valid():
            prioritycriteria.save()
        return HttpResponseRedirect(self.get_success_url())

模型.py

class Priority(models.Model):
    title = models.CharField(verbose_name="Priority Name", max_length=250)
    
    def __str__(self):
        return self.title
    
class Project(models.Model):
    name = models.CharField(verbose_name="Name", max_length=100)
    details = models.TextField(verbose_name="Details/Description", blank=False)
    creator = models.ForeignKey(User, on_delete=models.CASCADE)
    
class ProjectPriority(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    priority = models.ForeignKey(Priority, on_delete=models.CASCADE)
    score = models.CharField(max_length=1000, choices=priority_choices)
    
    class Meta:
        verbose_name = "Priority"
        verbose_name_plural = "Priorities"

模板

<table class="table table-light">
  <tbody>
  {{ priorities.management_form }}
    {% for priority in priorities.forms %}
    <tr>
      {% for field in priority.visible_fields %}
      <td>
        {{ field.errors.as_ul }}
        {{ field }}
      </td>
      {% endfor %}
    </tr>
    {% endfor %}
  </tbody>
</table>

您可以通過在表單集中使用initial數據來完成此操作(請參閱此處的 Django 文檔)。

在您的 views.py 代碼中,您可以添加此行來為priority字段生成一些initial值:

initial = [{'priority': priority} for priority in Priority.objects.all()]

然后將其傳遞給您的表單集:

data['priorities'] = PriorityChildFormset(initial=initial)

請注意, initial需要一個與您創建的表單集長度相同的列表,該列表由extra參數定義。 這是可行的,因為這兩個參數都是使用相同的基本查詢集(即Priority.objects )定義的。 如果應用了過濾器 - 它需要在兩個地方都應用。

改變它的顯示方式

此外,如果您想防止用戶使用下拉菜單更改priority字段,您可以將widgets關鍵字參數傳遞給inlineformset_factory以在生成的<select>元素上設置disabled屬性,例如:

from django import forms
...

widgets={'priority': forms.Select(attrs={'disabled': True})}

如果您希望該字段顯示文本 - 這更加困難。 我們想要的相關 object 的字符串表示隱藏在用於生成每個<option>的字段選擇中。 如果你想這樣做,你可以手動挖出每個字段:

{% for priority in priorities.forms %}
  <tr>
    <td>
      {{ priority.priority.errors.as_ul }}
      {% for value, name in priority.priority.field.choices %}
        {% if value == priority.priority.value %}
          {{ name }}
        {% endif %}
      {% endfor %}
      {{ priority.priority.as_hidden }}
    </td>
    <td>
      {{ priority.score.errors.as_ul }}
      {{ priority.score }}
    </td>
  </tr>
{% endfor %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM