【发布时间】:2021-06-26 19:04:58
【问题描述】:
提前感谢您的任何建议。几天来,我一直在研究如何使用 CreateView 正确实现表单集,但我被困住了。这是我的代码。
我的模特:
class Team(models.Model):
team_name = models.CharField(max_length=264,null=False,blank=False)
class Player(models.Model):
player_name = models.CharField(max_length=264,null=False,blank=False)
team = models.ForeignKey(Team,null=True,on_delete=models.CASCADE)
我的观点:
class CreateTeamView(LoginRequiredMixin,CreateView):
model = Team
form_class = CreateTeamForm
template_name = 'create_team.html'
def get_context_data(self, **kwargs):
context = super(CreateTeamView, self).get_context_data(**kwargs)
if self.request.POST:
context['new_player'] = NewPlayerFormSet(self.request.POST)
else:
context['nwe_player'] = NewPlayerFormSet()
return context
def get_form_kwargs(self, *args, **kwargs):
kwargs = super(CreateTeamView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_valid(self, form):
context = self.get_context_data()
new_player_form = context['new_player']
if new_player_form.is_valid():
self.object = form.save()
new_player_form.instance = self.object
new_player_form.save()
instance = form.save()
else:
return self.render_to_response(self.get_context_data(form=form))
我的表格:
class CreateTeamForm(forms.ModelForm):
class Meta:
model = Team
exclude = []
NewPlayerFormSet = inlineformset_factory(Team, Player, extra=1, fields=['player_name',])
我的 HTML:
<div="players>
<div="add_players">
{{ new_player.management_form }}
{% for form in new_player %}
{{ form.id }}
{{ form.player_name }}
</div>
</div>
我的表单正在保存一个玩家,但是当我尝试更新代码以使用初始 CreateView 保存多个玩家时,它只识别第一个联系人。我已经重写了 BaseInlineFormset 来进行验证,如下所示....
class NewPlayerFormSet(NewPlayerFormSet,BaseInlineFormSet):
player_name = forms.CharField(required=True,widget=forms.TextInput)
def add_fields(self, form, index):
super(NewPlayerFormSet,self).add_fields(form,index)
form.fields['player_name'].required = False
def clean(self):
super(NewPlayerFormSet, self).clean()
for form in self.forms:
if form.cleaned_data.get('player_name'):
pass
else:
form.add_error('player_name','Player Name is required.')
pass
我正在尝试获取代码以保存第二个联系人。我已经尝试过各种 JQuery 尝试......但我不清楚我的问题是与 JQuery 还是可能是我的 HTML 模板有关?这就是我卡住的地方。
我尝试做类似...
$(document).ready(function() {
// Watch for the 'add player' click
$('#add_player').click(function(e) {
e.preventDefault();
$('div.add_player:last').clone().each(function(i) {
$(this).find('input,select').each(function(i) {
// Remove any existing values
$(this).val('');
}).appendTo('div#players');
});
});
虽然这可以复制表格,但没有保存第 1 号以外的玩家。不知道我做错了什么。
似乎有一个用于此的 JQuery 插件,但出于多种原因,我试图避免使用它。再次感谢您为我指明正确方向的任何帮助。
【问题讨论】:
标签: django django-models django-views django-forms django-templates