簡體   English   中英

Django CreateView 禁用字段不發送字段數據

[英]Django CreateView disabled field not sending field data

當我將 CreateView 與 form_class 一起使用時,Django 無法在數據庫中創建項目。 在 form_class 我使用禁用字段和初始數據。 每次我提交表單時,數據都不會在 DB 中創建。

然后我嘗試覆蓋 class 中的 post 方法。 禁用的字段不發送字段數據,盡管數據已經啟動

  • 視圖.py
class CreateReport(CreateView):
    model = Letter
    form_class = LetterForm
    template_name_suffix="_create_form"
    success_url="/report/"
    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        context=self.get_layout(context)
        return context

    def get_initial(self):
        return {"applicant": self.request.user}

    def get_layout(self,context):
        context['layout'] = Page.objects.get(layout__name="report").layout 
        items_pra=context['layout'].items.all()
        q=Q()
        items=[]
        for item in items_pra:
            q|=Q(id=item.source_id)
            table=apps.get_model(app_label='component',model_name=item.type)
            items.append(table.objects.get(q))
        context['items']=items
        return context
  • 表格.py
class LetterForm(ModelForm):
    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
    class Meta:
        model = Letter
        exclude=['departement_head','date_submitted','date_approved','status']
        widgets = {
            'applicant': Select(attrs={'disabled':True,'readonly':True}),
            'about': Textarea(attrs={'rows': 3,'class':'align-items-start d-flex '}),
            'research_begin': DateInput(attrs={'type':'date'}),
            'research_finish': DateInput(attrs={'type':'date'}),
        }
  • letter_create_form.html
{% block content %}
<div class="content ms-5 me-5" >
  <form style="margin-top:5rem" action="{% url 'create_report' %}" method="post">
    {% csrf_token %}
    {% for field in form %}
      <div class="row">
        <div class="col-2">
          <label for="{{ field.name.id_for_label }}">{{field.name|snake2title}}: </label>
        </div>
        <div class="col-5">
          {{ field}}
        </div>
      </div>
    {% endfor %}
    <input class='btn btn-outline-success mt-5 col-5' type="submit" value="Submit">
  </form>
</div>
{% endblock content %}
  • model.py
class Letter(models.Model):
    applicant=models.ForeignKey('auth.User',on_delete=models.CASCADE)
    supervisor=models.ForeignKey('Lecturer',on_delete=models.CASCADE,related_name='letter_supervisor')
    departement_head=models.ForeignKey('Lecturer',on_delete=models.CASCADE,related_name='letter_departemen_head',null=True)
    about=models.TextField()
    research_begin=models.DateField()
    research_finish=models.DateField()
    date_submitted=models.DateField(auto_now=True)
    date_approved=models.DateField(null=True)
    status=models.CharField(max_length=1,default='P',choices=[("P","On Progress"),("A","Approved")]) #Waiting, Aprroved

    def __str__(self):
        return self.applicant.username

class Lecturer(models.Model):
    name=models.CharField(max_length=255)
    sign=models.ImageField()
    def __str__(self):
        return self.name
  • request.POST 覆蓋 post 方法后打印請求 object (申請字段不發送數據)
Quit the server with CTRL-BREAK.
<QueryDict: {'csrfmiddlewaretoken': ['xxxx'], 'supervisor': ['1'], 'about': ['ffg'], 'research_begin': ['2022-08-23'], 'research_finish': ['2022-08-23']}>

在這種情況下如何從禁用/只讀字段發送數據?

不幸的是, <select>字段沒有只讀屬性。

最簡單的方法是添加一個使用名稱 django 的隱藏字段,否則會生成

 <form style="margin-top:5rem" action="{% url 'create_report' %}" method="post">
    {% csrf_token %}
    <input type="hidden" id="id_applicant" name="applicant" value="{{request.user.id}}">
  ...

暫無
暫無

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

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