2016-04-19 10 views
0

いくつかのフィールドを持つフォームがあります。 2つ以外のすべてのフィールドをフォームに表示したい。ただし、1つのフィールドデータを表示する必要があります。 フォームを取得できましたが、表示するDBからデータを取得できませんでした。djangoでのレンダリング中にデータを取得する

Model.py

class Company(models.Model): 
    STATUS_CHOICES=(
        ('service','service'), 
        ('product','product'), 
    ) 
    user=models.OneToOneField(settings.AUTH_USER_MODEL) 
    company_name=models.CharField(max_length=250) 
    company_address=models.CharField(max_length=250) 
    Company_telephone=models.CharField(max_length=250,blank=True) 
    company_email=models.CharField(max_length=250,blank=True) 
    company_website=models.CharField(max_length=250,blank=True) 
    VAT=models.CharField(max_length=250,blank=True) 
    Service_Tax=models.CharField(max_length=250,blank=True) 
    company_PAN=models.CharField(max_length=250,blank=True) 
    company_bankdetails=models.CharField(max_length=250,blank=True) 
    invoice_type=models.CharField(max_length=250,choices=STATUS_CHOICES,default='service') 

    def __str__(self): 
     return 'self.user.company_name' 

forms.py

class companyeditform(forms.ModelForm): 
    class Meta: 
     model=Company 
     exclude = ('user','company_name',) 

views.py

@login_required 
def companyadd(request): 
    if request.method == 'POST': 
     company_form=companyeditform(instance=request.user.company,data=request.POST) 
     if company_form.is_valid(): 
      new_form=company_form.save(commit=False) 
      new_form.save() 
      return render(request,'account/dashboard.html',{'section':'addcompany'}) 
    else: 
     company_form=companyeditform(instance=request.user.company) 
    company_details=Company.objects.get(user=request.user.company) 
    return render(request,'account/company.html',{'company_form':company_form}) 

フォームが計画通りにすべての作品が表示されます。しかしcompany_nameを取得していない。 このクエリを使用して会社名を取得します。

company_details=Company.objects.get(user=request.user.company) 

Djangoは次のエラーを与える:

Cannot query "self.user.company_name": Must be "User" instance. 

答えて

3

このクエリでは、company_details=Company.objects.get(user=request.user.company)は、特定のユーザーの会社を取得しようとしています。しかし、この文では、user=request.user.companyを比較しています。両方とも2種類あります(ユーザーはauthuserモデル、request.user.companyはCompanyモデルです)。クエリでこれを行うことはできません。

company_details=Company.objects.get(user=request.user)この声明はこの問題を解決します。また、関連付けはOneToOneであるため、 company_details=request.user.companyを実行することもできます。

1

request.userAnonymousUserようなクラスであるかもしれません。 request.userdjango.contrib.auth.get_user_model()によって提供されるタイプであることを保証するために、いくつかの特別な処理を行います。

+0

login.requiredデコレータは現在のユーザーが有効なユーザーであり、認証されているため、request.userはAnonymousUserになりません。 –

2

あなたは、現在のユーザーに一致する会社を、それをフィルタリングすることで、当社を取得しようとしているが、あなたは、実際の会社のオブジェクトに渡しているので、あなたがそのエラーを取得している理由は、次のとおりです。

company_details=Company.objects.get(user=request.user.company) 
#              ^^^^^^^ 

company_details=Company.objects.get(user=request.user) 

をしかし、あなたはすでにあなたは、単に、それを再度フェッチする必要はありません、request.user.companyに、正しいオブジェクトを持っている:あなたはこれを行うことにより、ラインを修正することができます

あなたが renderショートカットを使用しているので、
company_details = request.user.company 
print(company_details.company_name) 

実際には、あなたも、あなたが本当にする必要があるすべては、リクエストオブジェクトは、あなたのテンプレートで利用できるようになりますように、この手順を実行する必要はありません。

Company: {{ request.user.company.company_name }} 

最後に、POST要求後にリダイレクトする必要があります(this article on wikipedia for the details参照)。

関連する問題