0

好吧,看來我在這個小任務上超出了我的頭。我想問一個人如何提交表單,而不依賴URL值?提交表單不依賴於URL

在我的示例中,用戶必須先登錄才能看到他們的圖片庫圖片。確定這是通過「上下文」,它具有分配給它的活動用戶(登錄)。道具到@ chem1st & @丹尼爾羅斯曼在早些時候幫助我解釋昨天的幫助。現在它可以在登錄後在主頁中顯示自己的用戶圖庫。

我不喜歡用「blahblah.com/bobby/upload」上傳,因爲它看起來不太安全。我想讓登錄用戶通過「blahblah.com/upload/」上傳。這意味着view.py中的表單必須獲取以某種方式登錄的用戶的上下文,並將數據保存到該帳戶下的數據庫中。

我一直在四處尋找答案,但找不到任何東西。有人能幫助我指出正確的方向嗎?

這裏是我的models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    activation_key = models.CharField(max_length=40, blank=True) 
    key_expires = models.DateTimeField(default=datetime.date.today()) 

    def __str__(self): 
     return self.user.username 

    class Meta: 
     verbose_name_plural='User profiles' 


class ImageDoc(models.Model): 
    user = models.ForeignKey(UserProfile) 
    imgfile = models.ImageField(upload_to='images/') 

forms.py:

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'placeholder': 'E-mail address'})) 
    first_name = forms.CharField(required=True) 
    last_name = forms.CharField(required=True) 


    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'email', 'username', 'password1', 'password2') 


    class ImgDocForm(forms.Form): 
     user_file = forms.ImageField() 


    def clean_user_file(self, *args, **kwargs): 
     cleaned_data = super(ImgDocForm,self).clean() 
     user_file = cleaned_data.get("user_file") 

     if user_file: 
      if user_file.size > 5 * 1024 * 1024: 
       raise forms.ValidationError("Filesize is too big.") 

      if not os.path.splitext(user_file.name)[1].strip().lower() in ['.jpg','.png','.gif','.jpeg']: 
       raise forms.ValidationError("File does not look like as picture.") 

     return user_file 


    class UserForm(forms.Form): 
     class Meta: 
      model = User 
      fields = ['first_name', 'last_name', 'password', 'email', 'username'] 

我views.py文件(編輯:更改索引來顯示用戶的詳細信息,畫廊,和快速上傳功能):

def sign_in(request): 
    context = RequestContext(request) 

    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 

     if user: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/', context) 
      else: 
       return HttpResponse("Verify your account!") 
     else: 
      return HttpResponse("Invalid login details supplied.") 


def populateContext(request, context): 
    context['authenticated'] = request.user.is_authenticated() 
    if context['authenticated'] == True: 
     context['username'] = request.user.username 


def index(request): 
    user_details = UserProfile.objects.get(user=request.user) 
    gallery = ImageDoc.objects.filter(user_id=request.user.id) 

    if request.method == 'POST': 
     form = ImgDocForm(request.POST, request.FILES) 
     if form.is_valid(): 
      origin_form = form.cleaned_data["user_file"] 
      origin_name = origin_form.name 

      original_name = ImageDoc(user_id=request.user.id, imgfile=origin_name) 
      original_name.save() 

      return HttpResponse('Saved!') 
    else: 
     form = ImgDocForm() 

    documents = ImageDoc.objects.all() 

    return render(request, 'test.html', {'documents': documents, 'form': form, 'user_details': user_details, 'gallery': gallery}) 




def upload(request): 
    data = {} 
    thumb_size = (100,100) 
    micro_thumb_size = (50,50) 

    if request.method == 'POST': 
     userform = ImgDocForm(request.POST, request.FILES) 

     if userform.is_valid(): 
      origin_form = userform.cleaned_data["user_file"] 
      origin_name = origin_form.name 
      original_file = os.path.join(settings.MEDIA_ROOT, origin_name) 

      . 
      . 
      . 

      original_name = ImageDoc(imgfile=origin_name) 
      original_name.save() 

      . 
      . 
      . 

      userform = ImgDocForm() 
     else: 
      return HttpResponse('Nooo!') 

    else: 
     userform = ImgDocForm() 

    data.update(image_gallery = ImageDoc.objects.only('imgfile')) 
    data.update(userform=userform) 
    data.update(csrf(request)) 
    return render(request, 'upload.html', data) 

編輯:我敢肯定,人們可以清理索引文件顯着。另外,底部不是很優雅,但它的工作原理。

而且upload.html文件:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
</head> 
<body> 

<div> 

    <form method="post" action="" enctype="multipart/form-data"> 
     {% csrf_token %} 
     {{ userform.as_p }} 
     <input type="submit"> 
    </form> 

    <br><br> 

    <h2>{{ origin_name }} (original)</h2> 

    {% if origin_name %} 
     <img src="{{ MEDIA_URL }}{{ origin_name }}"> 
    {% endif %} 

    <br><br> 
    {% if image_gallery %} 
     {% for image in image_gallery %} 
      <img src="/{{ image.thumbfile }}"> 
     {% endfor %} 
    {% endif %}  
</div> 
</body> 
</html> 

謝謝!

回答

1

您可以將當前登錄的用戶視爲request.user

+0

感謝您的回覆! 所以我應該獲得使用該ID,並使用它作爲PK,對嗎?像這樣? userform = ImgDocForm(request.POST,request.FILES,pk = request.user.id) – Bob

+0

@Bob你是否試圖從上傳的文件中創建ImgDoc?你可以將它分配給你的'ImgDoc.user'字段。如果你想將它分配給表單,請參閱http://stackoverflow.com/questions/18246326/in-django-how-do-i-set-user-field-in-form-to-the-currently-logged-在用戶 – serg

+0

感謝您回覆@serg!是的,我試圖將文件存儲到ImgDoc中。你鏈接的例子似乎並不幸運,但也許我錯誤地實現了它?目前我正在嘗試使用formset來完成這項工作,這是推薦的嗎?或者那是錯誤的方式呢?我之所以用這個原因是因爲我之前有一個類似的項目,兩個相關的模型,我無法保存到子模型中。使用formsets允許我這樣做。 。 但是,在這種情況下,我沒有使用從URL中捕獲的ID。稍後,我會粘貼下面的當前代碼供您檢查。 – Bob