【发布时间】:2017-05-08 12:20:39
【问题描述】:
我遇到了一个我花了几个小时试图克服的障碍,我希望得到一些指导。
我有两个模型:Listings 和 Addresses,结构如下:
class Listings(models.Model):
created_date = models.DateTimeField(auto_now_add=True)
pub_date = models.DateTimeField(auto_now_add=True)
address = models.ForeignKey(Addresses)
user = models.ForeignKey(User, on_delete=models.CASCADE)
is_active = models.BooleanField(default=1)
class Addresses(models.Model):
address1 = models.CharField(max_length=100)
address2 = models.CharField(max_length=100)
address3 = models.CharField(max_length=100)
address4 = models.CharField(max_length=100)
postcode = models.CharField(max_length=8)
我也有这些:
class AddressForm(ModelForm):
class Meta:
model = Addresses
fields = ['address1', 'address2', 'address3', 'address4', 'postcode']
class ListingForm(ModelForm):
class Meta:
model = Listings
fields = ['user']
我正在尝试创建一个将添加新列表的表单,但是要输入的唯一信息是地址模型中的字段。提交表单后,我需要创建一个新的 Listings 对象和一个新的 Addresses 对象,但 Listings 对象的“用户”外键必须等于当前登录用户的 id。
这是视图:
@login_required(login_url='share:login_view', redirect_field_name='share:addlisting')
def addlisting(request):
ListingInlineFormSet = inlineformset_factory(Addresses, Listings, form=ListingForm, can_delete=False, extra=1)
if request.method == 'POST':
address_form = AddressForm(request.POST)
if address_form.is_valid():
new_address = address_form.save()
listing_formset = ListingInlineFormSet(request.POST, request.FILES, instance=new_address)
if listing_formset.is_valid():
listing_formset.save()
return HttpResponseRedirect(reverse('/listing_added/'))
else:
address_form = AddressForm()
listing_formset = ListingInlineFormSet()
return render(request, 'share/addlisting.html', {
"address_form": address_form,
"listing_formset": listing_formset,
})
在其当前状态下,我得到一个包含所有地址字段的表单,以及一个下拉用户字段。提交表单后,它会创建一个包含两个外键的新列表:一个用于所选用户,另一个用于刚刚创建的新地址。这个最终结果是我想要的。但是,我不希望表单中有下拉用户字段 - 我需要将用户设置为当前用户。我尝试在 ListingForm 类中使用“exclude = ['user']”而不是“fields = ['user']”,但这会导致创建一个新地址而没有创建一个与之配套的列表。所以我得到的只是一个新地址,没有列表。
我做错了什么?我会很感激这个问题的解决方案,因为我已经把头撞在墙上很长一段时间了!
【问题讨论】:
-
我应该提到包含ListingForm(而不仅仅是AddressForm)的原因是我计划在适当的时候在表单中包含其他字段(这将是Listings对象的一部分) - 我只是想首先获得表单结构。我有理由希望将地址与列表分开,因此不将地址放在列表对象中。
标签: django django-models django-forms inline-formset