我是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)
答案 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)
...
请更改模型的结构并编辑问题。我相信这也是其他人的建议。
请记住,主模型不会有外键字段。
更新:更改了模型,以便您维护本地和永久地址。