2015-10-07 82 views
1

我的django項目我有一個頁面允許用戶編輯他們的列表,爲此我添加一個檢查,確保打開頁面的人是列表的所有者。然而,即使我將它正在檢查的內容更改爲完全不相關的對象,我放入的if語句也總是返回true。我甚至將它從!=改爲==,它總是返回true,有人知道這裏發生了什麼嗎?如果聲明總是返回True

@login_required(redirect_field_name='login') 
def editlisting(request, pk): 

    post = JobListing.objects.get(pk=pk) 

    print(type(request.user)) 
    print(type(post.user)) 

    if request.user != post.user: 
     print("THIS WORKS") #This is for debugging 
     print(request.user) #This is for debugging 
     print(post.user) #This is for debugging 
     return redirect("index") 

    if request.method == "POST": 
     form = JobListingForm(request.POST, instance=post) 

     if form.is_valid(): 
      profile = form.save(commit=False) 
      profile.user = request.user 
      profile.save() 
      return redirect('index') 

    else: 
     form = JobListingForm(instance=post) 

    context = { 
     "form": form 
    } 

    return render(request, "editlisting.html", context) 

任何幫助表示讚賞!

編輯:

下面是在控制檯 - http://puu.sh/kBuuX/30501a9407.png

而且,這裏是我的模型代碼

class JobListing(models.Model): 

    region_choice = (
     ('1', 'Auckland'), 
     ('2', 'Wellington'), 
     ('3', 'Christchurch') 
    ) 
    industry_choice = (
     ('1', 'Accounting'), 
     ('2', 'Agriculture, fishing & forestry'), 
     ('3', 'Automotive'), 
     ('4', 'Banking, finance & insurance'), 
     ('5', 'Construction & Architecture'), 
     ('6', 'Customer service'), 
    ) 
    employment_type_choice = (
     ('1', 'Full Time'), 
     ('2', 'Part Time'), 
     ('3', 'One-off'), 
     ('4', 'Other') 
    ) 

    user = models.CharField(max_length=50) 
    job_title = models.CharField(max_length=30) 
    business_name = models.CharField(max_length=50) 
    pay_rate = models.FloatField() 
    employment_type = models.CharField(max_length=10, choices=employment_type_choice) 
    job_description = models.CharField(max_length=2000) 
    business_address_region = models.CharField(max_length=50, choices=region_choice) 
    business_address_suburb = models.CharField(max_length=50) 
    business_industry = models.CharField(max_length=50, choices=industry_choice) 
    contact_method = models.CharField(max_length=50) 
    active_listing = models.BooleanField(default=True) 

    class Meta: 
     verbose_name = 'Job Listing' 

    def __unicode__(self): 
     return "%s" % self.business_name 
+5

它在你的「調試」中打印什麼? – oliverpool

+0

在測試前移動打印語句,並添加'print(type(request.user)); print(type(post.user))'確保你比較了可比的對象。 –

+0

此外,嘗試使用.pk,當您期望來自同一個表的兩個項目時,最簡單的比較。 –

回答

3

快速修復:

if str(request.user) != str(post.user): 

在你調試,你會看到相同的字符串,因爲print函數隱式調用的函數str(它只能ptrint字符串)。但是你實際上試圖比較一個對象(request.user)和一個strict(post.user),這會產生意想不到的結果。


耐用修復:

在你JobListing模型,現場user應該是ForeignKey(而不是CharField)。

然後,您可以比較request.user和post.user(由@Beltiras建議)的pk(主鍵)屬性。

+0

最初我有用戶字段作爲onetoone但是我不得不改變,因爲它不會允許用戶有多個列表,因爲用戶名需要是唯一的。有關我如何解決這個問題的任何想法? –

+0

我剛剛意識到爲什麼我遇到的問題並不是獨一無二的,這是因爲當我保存更新後的表格時,它並沒有更新舊錶格,而是試圖創建一個新表格並且保留舊錶格。有想法該怎麼解決這個嗎? –

+0

你可能想看看[這個問題](http://stackoverflow.com/questions/4673985/how-to-update-an-object-from-edit-form-in-django)。如果您仍然無法解決您的問題,請打開另一個問題。 – oliverpool

-3

我不知道你的模型,但我想這JobListing.user是用戶的外鍵。在這種情況下,您將用戶實例與字符串進行比較,在任何情況下都會有所不同。也許你需要這樣的東西:

if request.user != post.user.username: 

檢查您的模型的正確的屬性名稱。

+1

如果它確實是一個fk,那麼該操作不會將用戶與一個字符串進行比較,它將是一個針對用戶的用戶,並且不能解釋爲什麼操作符的布爾運算符切換仍返回相同的值 – Sayse

+0

那麼,我們會對這個模型更開明。 –

+2

我認爲我們需要回答oliverpool的評論,至少在這是可以回答之前。 'request.user'在django中默認也是一個User實例。 – Sayse