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>
谢谢!
感谢您的回复! 所以我应该获得使用该ID,并使用它作为PK,对吗?像这样? userform = ImgDocForm(request.POST,request.FILES,pk = request.user.id) – Bob
@Bob你是否试图从上传的文件中创建ImgDoc?你可以将它分配给你的'ImgDoc.user'字段。如果你想将它分配给表单,请参阅http://stackoverflow.com/questions/18246326/in-django-how-do-i-set-user-field-in-form-to-the-currently-logged-在用户 – serg
感谢您回复@serg!是的,我试图将文件存储到ImgDoc中。你链接的例子似乎并不幸运,但也许我错误地实现了它?目前我正在尝试使用formset来完成这项工作,这是推荐的吗?或者那是错误的方式呢?我之所以用这个原因是因为我之前有一个类似的项目,两个相关的模型,我无法保存到子模型中。使用formsets允许我这样做。 。 但是,在这种情况下,我没有使用从URL中捕获的ID。稍后,我会粘贴下面的当前代码供您检查。 – Bob