2017-10-28 8 views
7

私はそれを改善することを決めるまで、うまく動作するdjango eコマースプロジェクトを持っています。私はユーザーに特定のサービスを注文させるが、注文するたびにその詳細(名前、エミール、住所など)を入力する必要があるので、ユーザーが請求先住所を追加して参照できるようにアプリケーションをアップグレードすることに決めた注文したり、ゲストとして続ける。電子商取引アプリケーションの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) 

ユーザが持っていないように、そのユーザーがアドレスや携帯電話を登録することができますので、私はその後、アカウントのアプリを作成し、Djangoのユーザに拡張

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}) 

ビュー注文するたびに入力してください。

私の新しいモデルは私が私の見解をコードする方法について混乱しています

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) 

を持っていますが、私は唯一の完全な名前、電子メールと電話番号を拡張することができています。どんな助けもありがとう。 githubのから事前に感謝

すべてのコードのコピーを https://github.com/Olar19/ecommerce

+0

[Djangoのカスタムフィールドでユーザーモデルを拡張する](https://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django) – itzMEonTV

+0

It重複していません。 – King

答えて

0

これは、ユーザーオブジェクトに建てを活用するための素晴らしいアイデアです。 Djangoは非常に「電池が含まれています」という意味です。つまり、Flaskというよりもはるかに使いやすく、User authシステムの大部分を占めています。

通常、ユーザーオブジェクトは、コンテキスト内でAccountオブジェクトのように見える1対1フィールドで拡張します。

more detail on one-to-one fields (from the docs)

あなたはB2Bの副B2Cたなら、あなたはAccountオブジェクトには会社名を収容して、Employeeオブジェクトは、その後、ユーザーからの延長となり、そのアカウントに従業員を割り当てることができます。あなたはその後、Orderオブジェクトからアカウントとユーザーのオブジェクトにアクセスすることができ

class Account(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.TextField(max_length=500, blank=True) 
    ... 

だからAccountオブジェクトと仮定してのようになります。

order = get_object_or_404(Order, id=order_id) 
username = order.user_account.username 

または注文からユーザーに参加したい場合は、アクセス許可のタイプのもの

orders = Order.objects.filter(user_account__user = request.user) 
+0

'order.user_account'にアクセスすることはできません。' related_name'は逆の関係に役立ちます.' Order.objects.filter(user_account__user = request.user)の ' – itzMEonTV

+0

はい。それは動作しません – King

+0

私はダム感じているので、誰かが私を助けてください。オーダーオブジェクトは、勘定科目オブジェクトの下流関係を持ちます。アカウントには、ユーザーとの間に1対1のダウンストリームがあります。 user_accountの代わりに単にaccount ... username = order.account.user.usernameを使用するとうまくいきません。言い換えれば、あなたが "account" vice "user_account"というアカウントを参照しているとうまくいくと思います。それが動作しない場合は、私はダミーのアプリケーションを構築し、それが動作していない理由を参照してください。駄目な解決策を申し訳ありません。 – sahutchi

0

のためにあなたは、アカウント(フィールド名は関係のない名前)を使用する必要があります

order.account.user 

を使用することができます

アカウントインスタンスtオーダーはこれを使用できます:

account.user_account.all() 

関連する名前は逆のアクセス名です。何をしようとする注文

1

にアカウントフィールドの名前に関連する名前に関連するオブジェクトからアクセス

ので、そのよりよいがやりたいために非常に一般的かつ合理的なものです。 Django Userモデルに情報を追加するには、主に2つの方法があります。 1)djangoユーザーモデルをオーバーライドして、独自のカスタムモデルを定義することができます。または、2)別のモデルを作成することができます。たとえばUserDataとし、UserDataにDjangoのUserモデルとOneToOneField接続を設定します。したがって、すべてのユーザーに対して、必要な追加のフィールド情報を格納する関連するUserDataがあります。既存のプロジェクトの途中でオプション1を実行することは難しく、オプション2に移行することをお勧めします。

djangoのドキュメントは、UserDataモデルを作成してユーザーにリンクする方法モデル。あなたはそれについて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のドキュメントを読み込むことだと思います。次に、ユーザー認証をアプリケーションに統合してみてください。最後に、カスタム・ユーザーデータ・クラスを作成してユーザー・モデルを拡張できます。

幸運を祈る!

+0

私の認証にDjango-allauthを使用しています。ユーザーモデルを拡張することは、私が直面している問題ではありません。問題は、注文アイテムn値を受け取り、ユーザが出荷先住所を帰属しているかどうか、または支払いを進める前に、いずれかを選択するために別の配送先住所を作成したいかどうかをチェックするチェックアウトシステムを作成する方法です。 – King

+0

質問にリンクを含めた私のgithubから自分の現在のコードを見ることができます – King

0

1人のユーザーが複数のアドレスを持つことを許可するために、OneToManyフィールドとしてEmail、AbstractUserを拡張したアカウントモデルを作成するだけでよいと思います。アドレスは

名前、住所1、住所2、POSTAL_CODE、市、州、 ユーザー(FK)

やオールを含む単一のテキスト・フィールドのようなフィールドを持つモデルとなり得ますinfoとuser-fkです。

ユーザーが自分の住所のいずれかを選択した場合でも、その注文に対応する住所をOrder-modelに追加するだけで、既に提供されている住所の中から1つまたは複数の住所を選択することができます。

これにより、order.accountとorder.addressを使用して、指定された注文のアカウントの詳細と住所の両方を取得することもできます。

関連する問題