本文介绍了ModelForm与Django中的OneToOneField的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Django中有两个与OneToOneField(PrinterProfile和PrinterAdress)相关的模型。
我试图用PrinterProfileForm做一个表单,但是由于某些原因,它不会将PrinterAddress字段传递到表单中(它不是由模板中的Djangomagic呈现)。



我应该怎么做,我的PrinterProfileForm还包括PrinterAddress(其相关的OneToOneField)的字段?



非常感谢

  class PrinterProfile(TimeStampedModel):
user = models.OneToOneField(User)
phone_number = models.CharField(max_length = 120,null = False,blank = False)
additional_notes = models.TextField()
delivery = models.BooleanField(default = False)
pickup = models.BooleanField(default = True)


#配置文件的主要地址,它将位于所有打印机的位置。
class PrinterAddress(TimeStampedModel):
printer_profile = models.OneToOneField(PrinterProfile)
formatted_address = models.CharField(max_length = 200,null = True)
latitude = models.DecimalField max_digits = 25,decimal_places = 20)#需要检查所需的精度。
longitude = models.DecimalField(max_digits = 25,decimal_places = 20)#需要检查这里需要的精度。
point = models.PointField(srid = 4326)

def __unicode __(self,):
return self.user.username

class PrinterProfileForm form.ModelForm):
class Meta:
model = PrinterProfile
exclude = ['user']


解决方案

您必须为 PrinterAddress 创建第二个表单,并在您的视图中处理这两个表单:如果全部((profile_form.is_valid(),address_form.is_valid())):

  
profile = profile_form.save )
address = address_form.save(commit = False)
address.printer_profile = profile
address.save()

当然,在模板中,您需要在一个< form> 标签之间显示两个表单: - )

 < form action =method =post> 
{%csrf_token%}
{{profile_form}}
{{address_form}}
< / form>


I have two models in Django that are related with a OneToOneField (PrinterProfile and PrinterAdress).I am trying to do a form with PrinterProfileForm, but for some reason it does NOT pass the PrinterAddress fields into the form (it's not rendered by Django "magic" in the template).

What should I do so that my PrinterProfileForm include as well the fields from PrinterAddress (its related OneToOneField)?

Thanks a lot

class PrinterProfile(TimeStampedModel):
    user = models.OneToOneField(User)
    phone_number = models.CharField(max_length=120, null=False, blank=False)
    additional_notes = models.TextField()
    delivery = models.BooleanField(default=False)
    pickup = models.BooleanField(default=True)


# The main address of the profile, it will be where are located all the printers.
class PrinterAddress(TimeStampedModel):
    printer_profile = models.OneToOneField(PrinterProfile)
    formatted_address = models.CharField(max_length=200, null=True)
    latitude = models.DecimalField(max_digits=25, decimal_places=20)  # NEED TO CHECK HERE THE PRECISION NEEDED.
    longitude = models.DecimalField(max_digits=25, decimal_places=20)  # NEED TO CHECK HERE THE PRECISION NEEDED.
    point = models.PointField(srid=4326)

    def __unicode__(self, ):
        return self.user.username

class PrinterProfileForm(forms.ModelForm):
    class Meta:
        model = PrinterProfile
        exclude = ['user']
解决方案

You have to create second form for PrinterAddress and handle both forms in you view:

if all((profile_form.is_valid(), address_form.is_valid())):
    profile = profile_form.save()
    address = address_form.save(commit=False)
    address.printer_profile = profile
    address.save()

Of course in the template you need to show both forms under one <form> tag :-)

<form action="" method="post">
    {% csrf_token %}
    {{ profile_form }}
    {{ address_form }}
</form>

这篇关于ModelForm与Django中的OneToOneField的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 11:23
查看更多