2010-12-19 2 views
2

Django를 배우기 위해 작은 프로젝트를 만들고 있는데, ModelForm 안에서 숨겨진 필드를 사용하려고 할 때 문제가 있습니다. Django의 HiddenInput이있는 ModelForm이 잘못되었습니다.

클래스 Theres는 :

class Post(models.Model): 
    title  = models.CharField(max_length = 140) 
    message  = models.CharField(max_length = 10000) 
    pub_date = models.DateTimeField() 

그리고 내 ModelForm :

:이 양식에 대해 생성 된 HTML이다

def edit(request, post_id): 
    if request.method == 'POST': 
     form = PostForm(request.POST, request.FILES) 
     if form.is_valid(): 
      print 'VALID' 
      dados = form.cleaned_data 
      post = Post.objects.get(pk=post_id) 
      post.title = dados['title'] 
      post.message = dados['message'] 
      post.save() 
      return HttpResponseRedirect(reverse('blog.views.detail', args=(post.id,))) 
     else: 
      print 'INVALID' 
    form = PostForm(instance=Post.objects.get(pk=post_id)) 
    return render_to_response('blog/add_post.html', {'form' : form,}, context_instance = RequestContext(request)) 

: 이것은이다

class PostForm(ModelForm): 
    class Meta: 
     model = Post 
     fields = ('title', 'message', 'pub_date',) 
     widgets = { 
      'message' : Textarea(attrs={'cols':80, 'rows':20}), 
      'pub_date' : HiddenInput(), 
     } 

<div style='display:none'> 
<input type='hidden' name='csrfmiddlewaretoken' 
value='3b7c0735bf464fb4fd7dcd3011050e1c' /> 

</div> 
<tr> 
    <th><label for="id_title">title:</label></th> 
    <td><input id="id_title" type="text" name="title" value="asd1111111111" maxlength="140" /></td> 
</tr> 
<tr> 
    <th><label for="id_message">message:</label></th> 
    <td><textarea id="id_message" rows="20" cols="80" name="message">asd11111111111</textarea> 
    <input type="hidden" name="pub_date" value="2010-12-19 17:08:22.498000" id="id_pub_date" /></td> 
</tr> 

게시물을 만들고 편집 할 때 모두 동일한 템플릿을 사용합니다. 내가 만들 때, pub_date가 다른보기에서 설정되고 편집 할 때 pub_date를 내 템플릿에서 변경할 수 없습니다 (따라서 숨겨진 필드). 이 예제에서 form.is_valid()은 항상 False를 반환합니다. 내 양식에서 'pub_date' : HiddenInput(), 행을 제거하면 True를 반환합니다. 내가 뭘 잘못하고 있니?

+0

생성 된 페이지의 HTML 무엇 SplitHiddenDateTimeWidget로 변경하는 것입니다? – Robert

+0

작전, 질문에 그것을 잊어 버렸습니다. 끝난. –

+0

'form.errors'를 인쇄하면 어떻게됩니까? – Robert

답변

1

문제는 문자열에서 datetime 객체로 변환하는 데 있습니다.

input_formats 인수가 지정되지 않은 경우 datetime 필드는 string-> datetime 변환에 대해 이러한 형식을 사용합니다. (워드 프로세서 : http://docs.djangoproject.com/en/dev/ref/forms/fields/#datetimefield)

'%Y-%m-%d %H:%M:%S',  # '2006-10-25 14:30:59' 
'%Y-%m-%d %H:%M',  # '2006-10-25 14:30' 
'%Y-%m-%d',    # '2006-10-25' 
'%m/%d/%Y %H:%M:%S',  # '10/25/2006 14:30:59' 
'%m/%d/%Y %H:%M',  # '10/25/2006 14:30' 
'%m/%d/%Y',    # '10/25/2006' 
'%m/%d/%y %H:%M:%S',  # '10/25/06 14:30:59' 
'%m/%d/%y %H:%M',  # '10/25/06 14:30' 
'%m/%d/%y',    # '10/25/06' 

그래서 2010-12-19 17:08:22.498000 당신의 값이 작동하지 않습니다. DateTimeField에 대한

기본 위젯이 제대로 문자열로 datetime의 형식을, 그러나 당신이 보여준으로 HiddenInput 그냥 형식이없는 승/날짜 시간 오브젝트를 DateTimeInput 위젯입니다.

HiddenInput을 사용하려면 strftimedatetime 개체가 올바른 형식이어야합니다.

위젯을 숨기려면 HiddenInput으로 설정하지 말고 DateTimeInput 위젯을 그대로두고 attrs 인수로 해당 요소를 숨기십시오.

class PostForm(ModelForm): 
    class Meta: 
     model = Post 
     fields = ('title', 'message', 'pub_date',) 
     widgets = { 
      'message' : Textarea(attrs={'cols':80, 'rows':20}), 
      'pub_date' : DateTimeInput(attrs={'style': 'display:none;'}), 
     } 
+0

답변 해 주셔서 감사합니다. 이 경우, auto_now 및 auto_now_add 솔루션을 사용할 것입니다. 시간을 포맷하고 싶다면 어디에서해야합니까? 나는 양식이 이미 무효가된다는 관점에서 본다. –

+0

괜찮습니다. 흠, 나는 그것을보기에서 어떻게 바꿀 지 모르겠다. 최선의 방법은 HiddenInput을 사용하지 않고 DateTimeInput에서 서식을 처리하도록하는 것이지만보기에서 원하는 경우 모델 인스턴스의 pub_date를 myinstance.pub_date.strftime ("% Y- % m- % d % H : % M : % S "). 그러나 작동하는지 또는 양식에서 DB에 대한 다른 호출을하면 –

2

게시일을 게시일로 설정 하시겠습니까? 모델에서 auto_now를 사용해 보셨습니까?

pub_date = models.DateTimeField(auto_now=True) 
+0

나는 그것이 가능했다는 것을 몰랐다. 나는 파이썬과 장고에 좀 새로운 사람이다. 그러나이 게시물을 업데이트하면 변경 될 예정입니까? - 잊어 버려, 방금 auto_now__add에 대해 읽었습니다. –

0

또 다른 대안은 (숨겨진 필드) 위젯 유형이