内联表单集只保存最后一个表单

     2023-02-23     14

关键词:

【中文标题】内联表单集只保存最后一个表单【英文标题】:inline formset only save the last form 【发布时间】:2020-09-26 21:00:30 【问题描述】:

我尝试了很多方法并搜索了很多(谷歌搜索)但没有人为我工作。每当我保存我的 inlineformset 时,它只会保存最后一个表单, 我的模型.py

class Book(models.Model):
   book = models.CharField(max_length=20,unique=True)
   author = models.ForeignKey(Author,on_delete=models.CASCADE)

class Author(models.Model):
   author = models.CharField(max_length=30,unique=True)
   count = models.IntegerField()

这是我的forms.py

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ['author','count']
class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ['book']
InlineFormset_Author = inlineformset_factory(Author,Book,form=BookForm,extra=1)

这是我的看法

class CreateBookView(LoginRequiredMixin,SuccessMessageMixin,CreateView):
model = Author
form_class = AuthorForm
def get_context_data(self,*args,**kwargs):
    context = super(CreateBookView,self).get_context_data(*args,**kwargs)
    if self.request.POST:
        context['book'] = InlineFormset_Author(self.request.POST)
    context['book'] = InlineFormset_Author()
    return context
def form_valid(self,form):
    context = self.get_context_data()
    context = context['book']
    with transaction.atomic():
        self.object = form.save()
        if context.is_valid():
            context.instance = self.object
            context.save()
    return super(CreateBookView,self).form_valid(form)

这是我的模板

<form method="POST">% csrf_token %
    book.management_form
    form.author | add_class:'form-control col-12 col-sm-10 mx-auto'
    form.count | add_class:'form-control col-12 col-sm-10 mx-auto' | attr:'id:count'
    <button class="col-4 mx-auto  shadow-lg border-right border-left">insert</button>
    <div id="BOOK" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="my-modal-title" aria-hidden="true">

  <div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header">
  <h5 class="modal-title" id="my-modal-title">BOOK</h5>
  <p class="close" data-dismiss="modal" aria-label="Close">
 <div class="modal-body">
 <button type="submit" class="btn btn-success">save</button></dic>
 </div>
 <div class='modal-footer'></form>
<script>
$(document).ready(function()
$('#BOOKBTN').on('click',function () 
let allValue=[];
let numberOfInput=$('#count').val();
let allContent='';
let justforName=0;
let numOfContent=$('.modal-body input').length;
for(let j=0;j<numOfContent;j++)
justforName=j+1;

allValue.push($('input[name="BOOK'+justforName+'"').val());


if(numOfContent!=numberOfInput)
for(let i=0;i<numberOfInput;i++)
justforName=i+1;
% for i in book.forms %
  allContent+='i.book';
  % endfor %

$('.modal-body').html(allContent);

for(let j=0;j<allValue.length;j++)
justforName=j+1;

$('input[name="BOOK'+justforName+'"').val(allValue[j])
))
</script>

我使用小部件调整来为我的输入字段提供类和 ID 我错过了什么吗?或者我可能做错了什么?! 我已经准备好付钱让它工作了 感谢您的任何建议

【问题讨论】:

我也有同样的问题,django只保存extra参数中指定的表单数量。在你的情况下 1. 你弄清楚了吗? 【参考方案1】:

自从我在 Django 上做任何工作以来已经有好几年了,但我会尝试为您的代码添加注释并添加我的想法。

def form_valid(self,form):
    context = self.get_context_data() # This line looks fine
    context = context['book'] # You are overwriting your context here, call this 
    with transaction.atomic():
        self.object = form.save() # Your have a save here and one further down, this is also setting self object which may be incorrect.
        if context.is_valid():
            context.instance = self.object
            context.save()
    return super(CreateBookView,self).form_valid(form)

就像我说的,我已经好几年没有做过任何 Django 了,所以我只是参考了一些来自 https://github.com/timhughes/django-cbv-inline-formset/blob/master/music/views.py#L26 的旧代码(可能已经过时),我将用 cmets 进行注释。

def form_valid(self, form):
    context = self.get_context_data(form=form)  # Get the context data for the form in question.
    formset = context['track_formset']  # Extract the formset out of the context.
    if formset.is_valid():  # Validate the formset is valid
        response = super().form_valid(form)  # Call the parent class's form_valid.
        formset.instance = self.object  # Set the formsets type (instance of self.object) so that django knows how to save it.
        formset.save()  # Save the formset here
        return response  # Send a response to the user
    else:
        return super().form_invalid(form) # Send a response to the user with invalid form information.

【讨论】:

感谢您的回复,但在我的情况下,问题出在模板内,因为每当我使用自定义的脆皮表单和 jquery.formset.js 时它都会起作用,但我想构建自己的表单,并且仍然保存最后一个表单

Django - 带有内联表单集的 UpdateView 试图保存重复记录?

】Django-带有内联表单集的UpdateView试图保存重复记录?【英文标题】:Django-UpdateViewwithinlineformsetstryingtosaveduplicaterecords?【发布时间】:2015-12-1102:07:16【问题描述】:我有一个Expense模型和一个ExpenseLineItem模型。就像典型的费用/发... 查看详情

带有内联表单集的 Django 表单验证

】带有内联表单集的Django表单验证【英文标题】:Djangoformvalidationwithinlineformsets【发布时间】:2011-09-1714:40:57【问题描述】:我在一个HTML页面上有一个主表单和三个内联forset,目的是为客户创建Estimates。“主”表单的主键用作所... 查看详情

Django 中的内联表单验证

】Django中的内联表单验证【英文标题】:InlineFormValidationinDjango【发布时间】:2010-10-2700:53:15【问题描述】:我想在管理员更改表单中强制设置整个内联表单集。因此,在我当前的情况下,当我在发票表单(在管理员中)上点击... 查看详情

Django:使用 Jquery 的动态表单集仅保存第一个表单集实例

...描述】:所以我为示例设置了以下代码,然后是其外键的内联表单集,示例详细信息。我还向它添加了一些动态功能,以便您可以通过Jquery为表单集添加更多行。我从http://***.com/q 查看详情

提示用户保存表单

】提示用户保存表单【英文标题】:PromptforUsertoSaveaForm【发布时间】:2017-11-2705:32:45【问题描述】:我有一个关于我的班级数据库的最后一个问题。对于用户可以查看数据的某些表单,我希望他们能够关闭表单,并且如果他们没... 查看详情

如何在 Django 的表单中拥有嵌套的内联表单集?

】如何在Django的表单中拥有嵌套的内联表单集?【英文标题】:HowtohaveanestedinlineformsetwithinaforminDjango?【发布时间】:2011-07-2723:47:00【问题描述】:我希望这个问题还没有被问到,但我想知道是否有可能为对象提供一个基于类的... 查看详情

一行内联表单,输入字段上方有标签

】一行内联表单,输入字段上方有标签【英文标题】:Inlineforminonerowwithlabelsaboveinputfields【发布时间】:2015-03-1501:55:11【问题描述】:我正在使用angularjs和bootstrap3作为css构建一个Web应用程序(我对css的了解非常有限)。我想创建... 查看详情

带有清晰表单的内联表单集 - 仅显示一次标签

】带有清晰表单的内联表单集-仅显示一次标签【英文标题】:Inlineformsetwithcrispyforms-displaylabelsonceonly【发布时间】:2021-01-3115:29:48【问题描述】:我有一个内联表单集,其中包含清晰的表单。它工作得很好,但我得到每行上方显... 查看详情

Django:如何显示内联表单集中每个模型对象的表单错误

】Django:如何显示内联表单集中每个模型对象的表单错误【英文标题】:Django:howtodisplayformerrorsforeachmodelobjectinainlineformset【发布时间】:2012-03-1505:49:38【问题描述】:我有一个作者模型和一个书籍模型。用户可以修改给定作者的... 查看详情

Django 的内联表单

】Django的内联表单【英文标题】:Django\'sInlineForms【发布时间】:2011-06-1215:38:29【问题描述】:我正在尝试使用内联formSet创建记录,同时使用普通表单创建记录,其主键是内联formSet的外键都在同一个HTML页面上。有意义吗?这就... 查看详情

向我的表单集添加新的内联时,我的日期选择器停止工作

】向我的表单集添加新的内联时,我的日期选择器停止工作【英文标题】:whenaddinganewinlinetomyformset,mydatepickersstopworking【发布时间】:2011-10-0620:07:09【问题描述】:今天有点奇怪。我有一个非常基本的项目。一个表单并添加到我... 查看详情

如何从 django 中的内联表单接收上传的文件?

】如何从django中的内联表单接收上传的文件?【英文标题】:Howtoreceiveuploadedfilefromtheinlinedformindjango?【发布时间】:2011-01-1203:50:56【问题描述】:我正在尝试在django管理面板中创建一个“酷”的图像上传界面。问题是我使用内联... 查看详情

单元测试 django 内联表单集

】单元测试django内联表单集【英文标题】:Unittestingdjangoinlineformsets【发布时间】:2012-03-2004:20:24【问题描述】:在尝试通过内联表单集以编程方式发布新的ForeignKey对象时,我收到一个错误:ValueError:invalidliteralforint()withbase10:\'\'... 查看详情

如果引发 ValidationError,删除链接会在 Django 管理内联表单集中消失

】如果引发ValidationError,删除链接会在Django管理内联表单集中消失【英文标题】:DeletelinkdisappearsinDjangoadmininlineformsetifValidationErrorraised【发布时间】:2011-11-2501:40:59【问题描述】:我有一个带有KeywordInline的表格。当我使用表单... 查看详情

如何为未登录用户保存重力表单数据

】如何为未登录用户保存重力表单数据【英文标题】:HowtosaveGravityformdatafornon-loggedinuser【发布时间】:2021-11-1503:22:49【问题描述】:我创建了一个多级重力形式。在这里,任何用户(登录/未登录)都可以看到此表单。谈到非登... 查看详情

在 django 中保存相同表单的多个实例

】在django中保存相同表单的多个实例【英文标题】:Savingmultipleinstancesofsameformindjango【发布时间】:2016-08-1108:40:13【问题描述】:在我的模板中,用户可以添加(使用添加按钮:))相同表单的另一个实例(空一个ofc),但是当我... 查看详情

内联表单集工厂 - 将请求传递给子表单

】内联表单集工厂-将请求传递给子表单【英文标题】:Inlineformsetfactory-passrequesttochildform【发布时间】:2014-03-1911:48:58【问题描述】:我面临着相当具有挑战性的任务:我需要一个inlineformset_factory将我的ParentEntity连接到我的外键... 查看详情

如何为表单选择做可访问的内联错误?

】如何为表单选择做可访问的内联错误?【英文标题】:Howtodoaccessibleinlineerrorsforformselects?【发布时间】:2018-06-2106:56:53【问题描述】:我们需要更新我们的表单以符合可访问性。我正在寻找有关如何为表单选择编写内联错误的... 查看详情