2017-09-10 2 views
0

IP 및 URL과 필수 필드가있는 필드가있는 평가 모델이 있습니다. request.POST에서 이러한 필드 중 일부가 표시되지만 ip 및 url을 내보기에서 modelform으로 전달해야합니다. 내 모델 : 내 views.py에서Django 모델 폼에 request.POST와 함께 추가 매개 변수를 전달하십시오.

class Rating(models.Model): 

    rating = core_fields.SmallIntegerRangeField(min_value=1, max_value=5) 
    url = models.URLField(max_length=2048) 
    tracker = models.ForeignKey("core.Tracker", db_index=True) 
    ip = models.GenericIPAddressField(db_index=True) 
    user_agent = models.CharField(max_length=100) 
    object_id = models.PositiveIntegerField(db_index=True) 
    _content_type = models.ForeignKey(ContentType, db_index=True) 
    special_object = GenericForeignKey('_content_type', 'object_id') 

class Meta: 
    unique_together = ['_content_type', 'tracker', 'object_id'] 
    verbose_name = ('rating') 

:

form = RatingModelForm(request.POST, ip=ip, url=url) 

if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.save() 

그리고 내 forms.py의 : 초기 값하지만 form.is_valid을 설정

class RatingModelForm(forms.ModelForm): 

    class Meta: 
     model = Rating 
     exclude = ('special_object',) 

    def __init__(self, *args, **kwargs): 
     ip = kwargs.pop('ip', None) 
     url = kwargs.pop('url', None) 

     super(RatingModelForm, self).__init__(*args, **kwargs) 
     self.fields['ip'].initial = ip 
     self.fields['url'].initial = url 

내가 시도 ()는 False와를 제공하고 ip와 url이 필요하다는 것을 나타냅니다. 이걸 어떻게 처리할까요?

답변

1

ModelForm의 첫 번째 인수는 데이터입니다. 즉, 양식의 예상 데이터입니다. 당신이 말했듯이 request.POST은 변하지 않는 querydict입니다. copy out of it으로 새 사전을 만들고 수정 한 다음 양식에 전달하십시오.

django를 QueryDict에 사용하면 이상하게 보입니다. 따라서 쿼리가 제대로 작동하려면 dict의 복사본을 만들어야합니다.

data = request.POST.copy() 
data['ip'] = ip 
data['url'] = url 
form = RatingModelForm(data) 
+0

답변 주셔서 감사합니다. 그러나 request.POST는 필자의 경우 불변의 쿼리입니다. 그것을 수정할 수 없습니다 –

+0

@roushankumar 내 대답을 수정했습니다. – Jonathan

+0

@roushankumar 그게 도움이 되었습니까? – Jonathan