我有一个django电子商务项目工作正常,直到我决定改进它。我让用户在某些服务上下订单,但每次下订单时都要输入他们的详细信息(姓名,邮件,地址等),所以我决定升级应用程序,以便用户可以添加他们的帐单地址,并且可以参考在订单中或继续作为客人。
模型
class Order(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField()
address = models.CharField(max_length=250)
postal_code = models.CharField(max_length=20)
city = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
paid = models.BooleanField(default=False)
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='items')
product = models.ForeignKey(Product,related_name='order_items')
price = models.DecimalField(max_digits=10, decimal_places=2)
quantity = models.PositiveIntegerField(default=1)
查看
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order=order, product=item['product'],price=item['price'], quantity=item['quantity'])
cart.clear()
return render(request,'order/created.html', {'order': order})
else:
form = OrderCreateForm()
return render(request, 'order/create.html',{'cart': cart, 'form': form})
然后我创建了一个帐户应用程序和扩展的django用户,以便用户可以注册地址和移动设备,这样用户每次都不需要输入订单就可以输入。
我的新模型是
class Order(models.Model):
account = models.ForeignKey(Account, related_name='user_account')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
paid = models.BooleanField(default=False)
coupon = models.ForeignKey(Coupon, related_name='orders',null=True,blank=True)
discount = models.IntegerField(default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])
我对如何编写视图感到困惑。任何帮助都会有所帮助,我也有帮助
def admin_order_detail(request, order_id):
order = get_object_or_404(Order, id=order_id)
#account = Account.objects.filter(request.user)
context = {
'order': order,
}
template = 'order/detail.html'
return render(request,template,context)
能够查看管理区域中的订单详细信息,但我只能扩展FUll名称,电子邮件和电话号码。任何帮助,将不胜感激。提前致谢
来自github的所有代码的副本 https://github.com/Olar19/ecommerce
答案 0 :(得分:1)
你想要做的事情是非常普遍和合理的事情。有两种主要方法可以向Django User模型添加其他信息。 1)您可以覆盖django用户模型并定义自己的自定义模型或2)您可以创建另一个模型,比如UserData,并让UserData与Django的用户模型建立OneToOneField连接。因此,对于每个用户,都有一个关联的UserData,用于存储您需要的其他字段信息。很难并且不建议在现有项目的中间执行选项1,因此我建议转换到选项2.
django文档非常适合如何创建UserData模型并将其链接到User模型。你可以阅读它here。关于这种方法的一个关键注意事项是,您需要a)返回并为所有现有用户(如果存在)创建UserData对象,并且b)每次用户注册用户帐户时都需要确保创建UserData对象你的网页。
class UserData(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, default=0, related_name="userdata")
# other fields ...
现在,在您的视图中,您可以访问用户数据:
def admin_order_detail(request):
ud = request.user.userdata
当您想要在视图中访问用户数据时,它是
我只是查看了你的代码,看起来你目前没有使用Django的用户系统让用户注册和登录。我认为第一步是阅读用户身份验证系统(here)上的django文档。然后,尝试将用户身份验证集成到您的应用程序中。最后,您可以创建自定义userdata类来扩展用户模型。
祝你好运!答案 1 :(得分:0)
利用内置的User对象是一个好主意。 Django非常“包含电池”,这意味着它与Flask相比具有更多的开箱即用功能,而且对我来说是User auth系统的很大一部分。
通常,您将使用一对一字段扩展User对象,该字段在您的上下文中看起来像Account对象。
more detail on one-to-one fields (from the docs)
如果您是B2B副B2C,那么您可能希望Account对象存放公司名称,然后将员工分配到该帐户,其中Employee对象将成为User的扩展名。
假设Account对象看起来像:
class Account(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=500, blank=True)
...
然后,您可以从订单对象访问帐户和用户对象。
order = get_object_or_404(Order, id=order_id)
username = order.user_account.username
或权限类型的东西
orders = Order.objects.filter(user_account__user = request.user)
答案 2 :(得分:0)
你可以使用
order.account.user
如果您想从订单加入用户必须使用帐户(字段名称不相关名称)
如果您想从帐户实例加入订单,可以使用:
account.user_account.all()
相关名称是反向访问名称。从相关对象访问
因此,最好将帐户字段的相关名称命名为订单
答案 3 :(得分:0)
我认为您应该创建一个将AbstractUser扩展为电子邮件地址作为OneToMany字段的帐户模型,以允许一个用户拥有多个地址。地址可以是包含
等字段的模型姓名,地址第1行,地址第2行,邮政编码,城市,州, 用户(FK)
或包含all-info和user-fk的单个文本字段。
当用户选择其中一个地址时,您只需为该对应订单添加订单模型的地址条目,这样客户就可以从一个或多个已提供的地址中进行选择。
class Order(models.Model):
account = models.ForeignKey(Account, related_name='user_account')
address = models.ForeignKey(Address, related_name='address')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
paid = models.BooleanField(default=False)
coupon = models.ForeignKey(Coupon, related_name='orders',null=True,blank=True)
discount = models.IntegerField(default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])
这也使我们能够通过order.account和order.address检索给定订单的帐户详细信息和地址。