如何使用Django将ForeignKey字段保存到数据库中

时间:2018-05-24 09:17:09

标签: python django forms templates model

我是Django的新手我有两个型号是用户和地址,这里有两个用户 外键字段是' localaddress',' permanentaddress'

地址模型:

class Address(models.Model):

fulladdress = models.CharField(max_length=1000, null=True, blank=True)
additional_address = models.CharField(max_length=1000, null=True, blank=True)
street_address = models.CharField(max_length=150, null=True, blank=True)
route = models.CharField(max_length=150, null=True, blank=True)
city = models.CharField(max_length=100, null=True, blank=True)
state = models.CharField(max_length=100, null=True, blank=True)
country = models.CharField(max_length=100, null=True, blank=True)
pincode = models.IntegerField(null=True, blank=True)

class Meta:
    db_table = 'address'

用户模型:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
   localaddress = models.ForeignKey(Address, on_delete=models.CASCADE, related_name="localaddress", null=True, blank=True)
   permanentaddress = models.ForeignKey(Address, on_delete=models.CASCADE, related_name="permanentaddress", null=True, blank=True)

    class Meta:
       db_table = 'user'

settings.py:

AUTH_USER_MODEL = 'student.User'# changes built-in user model to ours

此处localaddress和permanentaddress都具有相同的外键(仅限地址模型)

编辑表格:

forms.py:

class LocaladdressForm(forms.ModelForm):

class Meta:
    model = Address

    fields = ['fulladdress', 'additional_address', 'street_address', 'route', 'city', 'state', 'country', 'pincode']

def save(self, commit=True):
        user = super(LocaladdressForm, self).save(commit=False)
        user.fulladdress = self.cleaned_data['fulladdress']
        user.additional_address = self.cleaned_data['additional_address']
        user.street_address = self.cleaned_data['street_address']
        user.route = self.cleaned_data['route']
        user.city = self.cleaned_data['city']
        user.state = self.cleaned_data['state']
        user.pincode = self.cleaned_data['pincode']
        user.country = self.cleaned_data['country']

        if commit:
            user.save()
        return user

views.py:

def address_form(request):
if request.method == 'POST':
    address = Address()
    form = AddressForm(request.POST, instance=address)
    if form.is_valid():
        form.save()
        userid = request.user.id
        User.objects.filter(pk=userid).update(localaddress=address)
        return redirect(reverse('student:view_profile'))
    else:
        args = {'form': form}
        return render(request, 'student/addressform.html', args)
else:
    form = AddressForm()
    args = {'form': form}
    return render(request, 'student/addressform.html', args)

我正在使用for循环来渲染表单元素,我不知道我在哪里做错了

addressform.html:

<form method="post">
    {% csrf_token %}
        {{ form.fulladdress }}
        {{ form.additional_address}}
        {{ form.street_address}}
        {{ form.street_address }}
        {{ form.city }}
        {{ form.state }}
        {{ form.pincode }}
        {{ form.country }}          
</form>     

这里我需要将一个表单localaddress和另一个表单permanentaddress外键字段呈现给我的模板。最初我正在尝试第一个表格(localaddress)请帮助我任何一个。

提前致谢...

Localaddress表单截图:我在这里使用google address api reference link Autocomplete Address

进行自动填充地址表单
I am able to persist address and user object but user object creating new object it is not persisting existing object (means localaddress)

enter image description here

1 个答案:

答案 0 :(得分:1)

我可以部分回答Django中的一个概念。

每当您在两个Django模型之间创建关系时,您就决定哪个模型将成为主模型。在这里你有用户模型和地址模型。我相信在大多数情况下,您会同意用户模型是主要模型,地址将是子模型或子模型或任何您称之为。

因此,您的ForeignKey字段应始终位于子模型上。因此,不要像在用户模型上那样使用ForeignKey,而应该执行以下操作:

address_type_choices = [
    (1, 'Local'),
    (2, 'Permanent'),
]

class Address(models.Model):
    user = models.ForeignKey(User)
    type = models.IntegerField(default=1, choices=address_type_choices)
    house = model.CharField(max_length=50)
    road = model.CharField(max_length=50)
    area = model.CharField(max_length=50)
    ...

请更改模型的结构并编辑问题。我相信这也是其他人的建议。

请记住,主模型不会有外键字段。

更新:更改了模型,以便您维护本地和永久地址。