【问题标题】:django fill form field automatically from context datadjango 从上下文数据自动填充表单字段
【发布时间】:2018-09-04 14:24:15
【问题描述】:

我有一个附加到DetailedView 的表单,保存后它可以正常工作。我希望表单字段(位置)预先填充来自详细视图(例如工作/人力资源经理)的值。表单字段的模型具有 JobPost 模型的外键。需要帮忙。我的部分视图看起来像这样

class JobsDetailView(DetailView):
model = JobPost
template_name = 'job_post-detail.html'

def get_context_data(self, **kwargs):
    context = super(JobsDetailView, self).get_context_data(**kwargs)
    context['position'] = JobPost.objects.order_by('position')
    context['job_app_form'] = JobsForm()
    return context

foms.py

 from django import forms
 from job_post.models import JobsApplied


class JobsForm(forms.ModelForm):
   class Meta:
      model = JobsApplied
      fields = '__all__'

  def form_valid(self, form):
     form.instance.customuser = self.request.user
     return super().form_valid(form)

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    我假设您不希望您的用户能够与这些预填充值进行交互或更改这些值。

    我正在制作一个 cmets/review 模型,我希望它能够自动将评论链接到他们所关注的人

    models.py

    class Review(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    ...
    

    我在 ReviewForm 中隐藏了 person 字段,以防止用户输入,方法是从“字段”中省略它或将其添加到“排除”中。

    forms.py

    class ReviewsForm(forms.ModelForm):
    
    class Meta:
        model = Review
        fields = ('rating', 'summary', 'review_text')
    

    然后,在视图中处理表单时,我使用 commit=False 以便在保存到数据库之前操作字段值。 包括预填充的值,保存然后将用户重定向到理想的位置

    views.py

    def person(request, area_slug, category_slug, person_id):
        ...
        if form.is_valid():
            pending_review = form.save(commit=False)
            pending_review.person = Person.objects.get(pk = person_id)
            pending_review.save()
            return HttpResponseRedirect(...)
    

    【讨论】:

      【解决方案2】:

      django 从 django 表单和 django 表单集的上下文数据中自动填充表单字段

      forms.py 中的表单集

      StoreRequestAccessoryUpdateFormSet = forms.modelformset_factory(StoreRequestAccessory, form=StoreRequestAccessoryUpdateForm, exclude=["storeRequestId"], can_delete=True)
      

      在 get_context_data 中,您可以根据需要为 django 添加它

      class StoreRequestUpdateView(LoginRequiredMixin, UpdateView):
          template_name = "Inventory/Stock/StoreRequest/StoreRequestUpdateView.html"
          model = StoreRequest
          fields = ["fromStoreId", "toStoreId", "reference", "status", "remark"]
          
          def get_context_data(self, **kwargs):
              context = super(StoreRequestUpdateView, self).get_context_data(**kwargs)
              
              print(self.object.pk)
          context.update({
                      # "StoreRequestForm": context.get("form"),
                      "StoreRequestForm": StoreRequestUpdateForm(instance=StoreRequest.objects.get(id=self.object.pk)),
                      "StoreRequestAccessoryForm": StoreRequestAccessoryUpdateFormSet(
                          queryset=StoreRequestAccessory.objects.filter(storeRequestId=self.object.pk), 
                          prefix="storereq_accessory_form"),
          })
      
          return context
      

      【讨论】:

        猜你喜欢
        • 2021-12-31
        • 2015-11-21
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 2012-11-10
        相关资源
        最近更新 更多